Ruby rails,表单按钮混淆了它们的路由

Ruby on rails, Form buttons get their routes mixed up

在 Rails 的 Ruby 中制作表单时,我遇到了一些奇怪的事情,我的 submit 按钮执行表单中另一个按钮的操作。

<%=form_for(happening) do |f|%>
   <%=f.text_field :name, class:"updateInput" %>
   <%=f.submit "Save", class:"editButton" %>
   <%= button_to "Delete", happening, method: :delete, class:"editButton"%>
   <input type="datetime-local" value="<%= happening.get_html_date %>">
<%end%>

当我单击此表单中的 submit 按钮时,它将被路由到 destroy 操作,而不是 update 操作。 当我删除 delete 按钮时,一切都正确路由。

有人对此有解释吗?谢谢

您的删除按钮应该在您的表单之外。

<%=form_for(happening) do |f|%>
   <%=f.text_field :name, class:"updateInput" %>
   <%=f.submit "Save", class:"editButton" %>
   <input type="datetime-local" value="<%= happening.get_html_date %>">
<%end%>

<%= button_to "Delete", happening, method: :delete, class:"editButton"%> 

您看到此行为是因为当您使用 button_to 帮助程序时,您看到的不仅仅是这些。 button_to 不只是创建一个按钮 -- 它实际上创建了一个完整的表单,实际按钮用作表单的提交按钮。

通过在表单中​​包含您的 button_to 助手,您违反了 HTML 的 "no nested forms" 规则并有效地为您的表单添加了第二个提交按钮,该按钮覆盖了预期的提交按钮。 HTML 中的提交按钮和输入按钮类型是有区别的,正如我已经提到的,button_to 创建了一个提交按钮。

如果您像 Ahmad 指出的那样将 button_to 移到表单之外,您将取消嵌套您的表单,并且您的视图应该按预期运行。

有关更多详细信息,请参阅 API doc