我正在尝试创建一个允许用户直接从索引页编辑客户端条目的功能。当用户单击"编辑"时,将呈现一个部分,该部分将元素替换为输入文本字段。但是当按下"更新客户端"按钮时,我收到错误:
"No route matches [POST] "/clients/27"
我能够直接从索引创建新客户端并销毁客户端...我在更新操作中做错了什么?
部分:
<tr id="test">
<%= form_for Client.find(27), :method => :PUT do |f| %>
<td class="input">
<%= f.text_field :name, :value => "Test" %>
</td>
<td class="input">
<%= f.text_field :company %>
</td>
<td class="input">
<%= f.text_field :email %>
</td>
<td class="grayedOut"></td>
<td class="actions">
<%= f.submit "Confirm edit" %>
</td>
<% end %>
</tr>
routes.rb 文件:
resources :clients do
resources :projects do
resources :items
end
end
我想通了。无论出于何种原因,在表中嵌套表单似乎会弄乱表单提交的方式。当我在表外部呈现部分时,表单提交更新操作没有问题。
我仍然对为什么会发生这种情况感到困惑。我对这个问题的解决方案是使用div 而不是表格。
编辑:好的,所以我对这个话题进行了更多的研究,发现"表格"不是<table>
或<tr>
的有效子项。为了解决这个问题,我将<%= form_for %>
标签放在第一个<td>
内,将<% end %>
标签放在最后一个<td>
内。现在它工作得很好!这是我的部分现在的样子:
<tr id="test">
<td class="input">
<%= form_for Client.find(27), :method => :PUT do |f| %>
<%= f.text_field :name, :value => "Test" %>
</td>
<td class="input">
<%= f.text_field :company %>
</td>
<td class="input">
<%= f.text_field :email %>
</td>
<td class="grayedOut"></td>
<td class="actions">
<%= f.submit "Confirm edit" %>
<% end %>
</td>
</tr>