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

jtw3ybtb  于 2023-10-17  发布在  Ruby
关注(0)|答案(3)|浏览(98)

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

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

liwlm1x91#

没有一种简单的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 on multibutton forms。

kmbjn2e3

kmbjn2e32#

此问题与this one非常相似,但略有不同
我只是想强调一下,对上述问题的一些回答也建议向路由添加约束,这样你就可以将查询路由到不同的控制器操作!
作者:vss123
我们使用Rails中的高级约束解决了这个问题。
这个想法是有相同的路径(因此也有相同的命名路由和动作),但有路由到不同动作的约束。

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

CommitParamRouting是一个简单的类,有一个方法匹配?如果提交参数与给定的示例属性匹配,则返回真。值
这可以作为gem commit_param_matching使用。

vwkv1x7d

vwkv1x7d3#

我也面临着同样的问题。
我有一个创建表单。但是,如果记录已经存在,我想通过搜索结果显示结果。

选项一:有两种形式

有两种不同的形式:

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

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

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

选项二:有一个表格,两个按钮

  • 就像西里尔·杜琼-Doris说的。
  • 隐藏搜索按钮。使用刺激控制器动作通过搜索按钮触发提交。
  • 涡轮流的结果。

相关问题