【问题标题】:form_for with multiple controller actions for submitform_for 具有多个用于提交的控制器操作
【发布时间】:2011-08-13 05:47:07
【问题描述】:

如何在 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


    【解决方案1】:

    没有一种简单的 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

    【讨论】:

    • 同意,保持简单,使用原生方式,js可以管理action url。我建议您使用另一种形式进行搜索,调整 CSS 以重新定位
    【解决方案2】:

    这个问题和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 是一个简单的类,它有一个方法匹配?哪一个 如果提交参数与给定的实例 attr 匹配,则返回 true。 价值。

    这可以作为 gem commit_param_matching 使用。

    【讨论】:

    • 请注意,与替换表单操作 url 的基于 JS 的答案不同,此方法完全依赖于后端,即使对禁用 javascript 的客户端也有效
    猜你喜欢
    • 2012-09-17
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多