根据用户选择的submit
按钮,(在这种情况下为Cat
和Dog
),我希望使用以下内容将表单提交给正确的控制器操作正确的http动词。
在这种情况下,有一个文本输入。如果用户按下Cat
,我希望POST
至Cats#create
以及Dog
至PUT
至Dogs#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 %>
问题是我想POST
到Dogs#create
,formaction
是否可以这样做?
有一个railscast关于根据按下的按钮的名称构建控制器的逻辑。但我想在提交按钮本身中提供关于HTTP动词,控制器和操作的逻辑。这可能吗?
答案 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 %>
该解决方案为您提供了此表单的单个表单和提交按钮。它的形式(Foos
或Bars
)取决于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 %>