将同一表格提交给不同的行动

时间:2017-02-10 08:43:47

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

根据用户选择的submit按钮,(在这种情况下为CatDog),我希望使用以下内容将表单提交给正确的控制器操作正确的http动词。

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

我如何构建表单?

enter image description here

修改

使用formaction属性我可以PUTDogs#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#createformaction是否可以这样做?

修改

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

2 个答案:

答案 0 :(得分:0)

您可以使用一些字段和提交按钮创建简单表单。然后创建类似的表单,但隐藏的字段将在用户填写第一个表单的字段(使用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.

答案 1 :(得分:0)

在这种情况下,创建Cat并更新Dog已足够相关,因此使用case statement处理CatsController并使用{{{}} 1}} :name按钮上的属性。

例如:

应用程序/视图/猫/ new.html.erb:

submit

应用程序/控制器/ cats_controller.rb:

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