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

问题描述 投票:0回答:3

如何在 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 %>
ruby-on-rails ruby ruby-on-rails-3 form-for
3个回答
21
投票

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 集 的多按钮表单。


2
投票

这个问题与这个问题非常相似,尽管有点不同

我只是想强调,上述问题的一些答案还建议向路由添加约束,这样您实际上可以将查询路由到不同的控制器操作!

感谢作者,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 使用。


0
投票

我面临着完全相同的问题。

我有一个创建表单。但是,如果记录已经存在,我想通过搜索结果显示结果。

选项 1:有两个单独的表格

有两种不同的形式:

<%= form_for @people do |f| %>
    <%= f.submit(:url => '/people/search') %>    
<% end %>

当您提交上面的表单时,编写一些 JavaScript 来同时提交下面的表单。

<%= form_for @people do |f| %>
    <%= f.submit(:url => '/people/search') %>    
<% end %>

选项 2:一个表格有两个按钮

  • 就像西里尔·杜尚-多丽丝所说。
  • 隐藏搜索按钮。使用刺激控制器操作通过搜索按钮触发提交。
  • Turbo 流式传输结果。
© www.soinside.com 2019 - 2024. All rights reserved.