如何在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 %>
答案 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。