如何在 form_for 提交中传递 url?我尝试使用一种表单,每个按钮都指向每个控制器操作,一个是搜索,另一个是创建。是否可以在同一个表单上有 2 个具有不同操作的提交按钮?
<%= form_for @people do |f| %>
<%= f.label :first_name %>:
<%= f.text_field :first_name %><br />
<%= f.label :last_name %>:
<%= f.text_field :last_name %><br />
<%= f.submit(:url => '/people/search') %>
<%= f.submit(:url => '/people/create') %>
<% end %>
Rails 没有一种简单的方法可以根据按下的按钮将表单提交到不同的 URL。您可以在每个按钮上使用 javascript 来提交到不同的 URL,但处理这种情况的更常见方法是允许表单提交到一个 URL 并检测在控制器操作中按下了哪个按钮。
对于第二种带有提交按钮的方法,如下所示:
<%= form_for @people do |f| %>
# form fields here
<%= submit_tag "First Button", :name => 'first_button' %>
<%= submit_tag "Second Button", :name => 'second_button' %>
<% end %>
你的动作看起来像这样:
def create
if params[:first_button]
# Do stuff for first button submit
elsif params[:second_button]
# Do stuff for second button submit
end
end
请参阅这个类似的问题,了解有关这两种方法的更多信息。
另外,请参阅 Railscast 第 38 集 的多按钮表单。
这个问题与这个问题非常相似,尽管有点不同
我只是想强调,上述问题的一些答案还建议向路由添加约束,这样您实际上可以将查询路由到不同的控制器操作!
感谢作者,vss123
我们使用 Rails 中的高级约束来解决问题。
这个想法是拥有相同的路径(因此具有相同的命名路线和 动作),但具有路由到不同动作的约束。
resources :plan do
post :save, constraints: CommitParamRouting.new("Propose"), action: :propose
post :save, constraints: CommitParamRouting.new("Finalize"), action: :finalize
end
CommitParamRouting 是一个简单的类,有一个方法匹配?哪个 如果提交参数与给定的实例属性匹配,则返回 true。 值。
这可以作为 gem commit_param_matching 使用。
我面临着完全相同的问题。
我有一个创建表单。但是,如果记录已经存在,我想通过搜索结果显示结果。
有两种不同的形式:
<%= form_for @people do |f| %>
<%= f.submit(:url => '/people/search') %>
<% end %>
当您提交上面的表单时,编写一些 JavaScript 来同时提交下面的表单。
<%= form_for @people do |f| %>
<%= f.submit(:url => '/people/search') %>
<% end %>