具有多个控制器动作的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。