2011-08-13 64 views
7

如何在form_for提交上传递一个url?我试图使用每个按钮指向每个控制器操作的一个窗体,一个是搜索,另一个是创建。是否有可能在同一个表单上提交2个不同的动作按钮?form_for提交多个控制器操作

<%= 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 %> 

回答

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

同意,保持简单,使用本地方法,** js **可以管理* action url *。我建议你使用另一种形式来搜索调整后的CSS以重新定位 – Anatoly

2

这个问题是非常相似的this one,虽然这是一个有点不同

我只是想higlight一些答案aforementionned问题还建议添加约束路由,因此可以真正路线查询不同的控制器操作

积分笔者,vss123

我们解决了在轨采用先进的约束。

这个想法是有相同的路径(并因此具有相同的命名路线& 行动),但约束路由到不同的行动。

resources :plan do 
    post :save, constraints: CommitParamRouting.new("Propose"), action: :propose 
    post :save, constraints: CommitParamRouting.new("Finalize"), action: :finalize 
end 

CommitParamRouting是一个简单的类,它有一个方法的比赛?如果提交参数匹配给定实例attr,那么 返回true。值为 。

这可作为宝石commit_param_matching。

+0

请注意,与基于JS的替换表单动作url的答案不同,此方法完全依赖后端,并且即使对于已禁用javascript的客户端也可以工作 –