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

时间:2011-08-13 05:47:07

标签: ruby-on-rails ruby ruby-on-rails-3 form-for

如何在form_for提交时传递网址?我正在尝试使用一个表单,每个按钮指向每个控制器操作,一个是搜索,另一个是创建。是否可以在同一表单上设置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 %>

2 个答案:

答案 0 :(得分:20)

根据按下的按钮,没有简单的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

有关这两种方法的更多信息,请参阅this similar question

另外,请参阅多按钮表单上的Railscast episode 38

答案 1 :(得分:2)

这个问题与this one非常相似,虽然它有点不同

我只想强调,对上述问题的一些回答也建议在路由中添加约束,这样您就可以将查询路由到不同的控制器操作!

作者的信用,vss123

  

我们解决了在rails中使用高级约束的问题。

     

这个想法是拥有相同的路径(因此命名相同的路线&amp;   行动)但限制路由到不同的行动。

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。