提交相同表单至不同操作

4

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

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

我该如何构建这个表单?

enter image description here

编辑

使用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 %>

问题是我想要使用formactionPOSTDogs#create,这是可能的吗?

编辑

有一个railscast视频讲解如何根据按钮名称构建控制器逻辑。但是我想要将关于HTTP动词、控制器和操作的逻辑放在提交按钮本身。这是否可能?


为什么不尝试使用AJAX而不是传统的HTML表单来进行不同的请求呢? - XY Li
2个回答

2
在这种情况下,创建一个Cat并更新一个Dog是相关的,因此在CatsController中处理两者并使用case语句:name属性处理submit按钮是有意义的。
例如:

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

0

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

或者是一种替代方案,这在我的项目中有效,可能也适合您的需求。要使用它,您需要引入一些“条件”,这些“条件”将“决定”使用哪个控制器和操作。

您的视图:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接