我使用相同的表单来创建新记录和编辑现有记录。如何根据表单是提交新记录还是编辑现有记录来指定要调用的控制器。
例如,在下面的代码中,如何根据表单是编辑现有记录还是提交新记录来更改f.submit调用的控制器?
<%= form_for :protocol, url: protocols_path, :html => {:class => 'form', :id => 'new-protocol'} do |f| %>
<h1>Create New Protocol</h1>
<div class="field">
<%= f.text_field :name, autofocus: true, placeholder: 'name'%>
</div>
<div class="actions">
<%= f.submit "Submit", class: 'button' %>
</div>
答案 0 :(得分:1)
我认为,基于docs,如果你这样做:
BSContext_Id
然后,根据PERTActivity_T
是新记录还是现有记录,表单将自动提交给正确的操作。 (使用符号产生的问题,例如<%= form_for @protocol :html => {:class => 'form', :id => 'new-protocol'} do |f| %>
...
<% end %>
,@protocol
无法判断您是否正在创建或更新。)
现在,你必须做些大惊小怪的事情。因为您需要切换:protocol
和form_for
,具体取决于您是在进行创建还是更新。
答案 1 :(得分:1)
默认情况下,form_for会自动生成表单操作,除非您指定了网址,http动词等...它会在create
和update
之间进行检查,以确定它是否为&#39; sa是否持久化对象,换句话说,检查对象是否具有id
。
理想情况下,您应该使用以下内容:
<%= form_for @protocol do |f| %>
<h1>Create New Protocol</h1>
<div class="field">
<%= f.text_field :name, autofocus: true, placeholder: 'name'%>
</div>
<div class="actions">
<%= f.submit "Submit", class: 'button' %>
</div>
这样:
@protocol = Protocol.new #=> the form action will point to create action
@protocol = Protocol.find(params[:id]) #=> the form action will point to update action