具有多个控制器动作的form_for用于提交

如何在form_for提交时传递url? 我正在尝试使用一个表单,每个按钮指向每个控制器操作,一个是搜索,另一个是创建。 是否可以在同一表单上设置2个具有不同操作的提交按钮?

 : 
:
'/people/search') %> '/people/create') %>

根据按下的按钮,没有简单的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是一个有方法匹配的简单类吗? 如果commit参数匹配给定的实例attr,则返回true。 值。

这可用作gem commit_param_matching。