我想在导轨中创建一个带有 2 个按钮的表单。两种形式都以不同的方式对相同的数据进行操作,我更愿意以两种不同的方法保留相关的功能。以前我在对 params[:commit] 进行字符串比较后重定向到适当的方法,但我的直觉说有更好的方法。建议?
4 回答
两个不同的提交按钮,将表单发送到两个不同的操作:
<%= submit_tag('Insert', :onclick=>"document.myForm.action = 'insert';") %>
<%= submit_tag('Update', :onclick=>"document.myForm.action = 'update';") %>
而不是“myForm”,您需要将任何内容放在标签的“name”属性中。
您可以在默认表单中设置该属性:for 标签,如下所示:
<%= form_for(@something, :html => {:name => "myForm"}) do |f| %>
在不使用 JavaScript 的情况下,您唯一的解决方案就是您提到的:通过查看控制器中的 POST 数据来检查单击了哪个按钮。这仅仅是由于 HTML 表单元素的性质。它的 action 属性不能有多个值。
如果您不担心 JavaScript 不可用时会发生什么,那么您可以在实际提交表单之前编写一些脚本来在单击提交按钮之一时更改操作属性。在 ajax 请求的情况下,它可以直接提交到正确的 URL,而无需更改表单上的属性。
我也已经在表单上使用了 params[:commit] 方法。使用 I18n 帮助器使这变得不那么脆弱,因为您可以在视图和控制器中使用相同的查找,因此您不会遇到字符串发生变化的问题。
除此之外,我只能想到使用 JavaScript 来处理按钮的点击,然后将表单数据发送到不同的 Rails 操作(也许您可以在提交表单之前使用 JavaScript 更改表单的 HTML 操作属性)。
如果您使用的是prototype.js,则可以使用Form.serialize() 从表单中获取数据,然后使用不同的按钮发布到不同的操作。