【问题标题】:Submit same form to different actions将相同的表单提交给不同的操作
【发布时间】:2017-02-10 08:43:46
【问题描述】:

根据用户选择的submit 按钮(在本例中为CatDog),我想使用正确的http 动词将表单提交给正确的控制器操作。

在这种情况下,只有一个文本输入。如果用户按Cat 我想POSTCats#create,如果DogPUTDogs#update

我将如何构建表单?

编辑

使用formaction 属性我可以将PUT 转换为Dogs#update

<%= form_for(cat) do |f| %>

  <div class="field">
    <%= f.label :name %>
    <%= f.text_field :name %>
  </div>


  <div class="actions">
    <%= f.submit "Cat" %>
    <%= f.submit "Dog", formaction: dog_path(Dog.first) %>
    <%#= f.submit "Cat", name: 'route_to[cat]' %>
    <%#= f.submit "Dog", name: 'route_to[dog]' %>
  </div>
<% end %>

问题是我想POSTDogs#create,这可以用formaction 吗?

编辑

有一个railscast 关于根据按下的按钮的名称构建控制器的逻辑。但我想将关于哪个 HTTP 动词、控制器和操作的逻辑放在提交按钮本身中。这可能吗?

【问题讨论】:

  • 你为什么不尝试使用 AJAX 而不是传统的 HTML 表单发出不同的请求。

标签: ruby-on-rails forms http strong-parameters


【解决方案1】:

在这种情况下,创建Cat 和更新Dog 足够相关,因此在CatsController 中处理case statement 并在submit 上使用:name 属性是有意义的按钮。

例如:

app/views/cats/new.html.erb:

<%= form_tag(cats_path, multipart: true, role: "form") do %>
  <%= button_tag 'Cat', name: 'route_to[cat]'%>
  <%= button_tag 'Dog', name: 'route_to[dog]' %>
<% end %>

app/controllers/cats_controller.rb:

def create
  case route_to params
  when :cat
    # create a cat
  when :dog
    # update a dog
  end
end
.
.
.
private

  def route_to params
    params[:route_to].keys.first.to_sym
  end

【讨论】:

    【解决方案2】:

    您可以创建带有一些字段和提交按钮的简单表单。然后创建类似的表单,但隐藏字段将在用户填写第一个表单的字段(为此使用 javascript)和可见的提交按钮时填充。所以用户填写第一个表单可见字段,javascript代码将值复制到第二个表单的相应隐藏字段。用户有两个提交点击。对于@items,您也可以有隐藏字段并在@items 值中手动设置字段值。

    或者一个替代解决方案,它适用于我的项目并且可能满足您的需求。要使用它,您需要引入一些 condition 来“决定”应该使用什么控制器和操作。

    你的看法:

    <% if condition %>
      <%= form_tag controller: "foos", action: "create", method: :post %>
      <%= render partial: 'form', locals: {button_name: "Foo"} %>
    <% else %>
      <%= form_tag controller: "bars", action: "update", method: :put do %>
      <%= render partial: 'form', locals: {button_name: "Bar"} %>
    <% end %>
    

    您的_form 部分:

    <%# Your form and @items fields %>    
    <%= submit_tag button_name %>
    

    该解决方案为您提供了一个表单和该表单的提交按钮。它将是什么形式(对于FoosBars)取决于condition.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-24
      • 2018-11-12
      • 1970-01-01
      相关资源
      最近更新 更多