form_with如何知道在模型中调用哪个方法?

时间:2019-06-18 22:35:33

标签: ruby-on-rails ruby-on-rails-5

我很难理解form_with的工作原理。为了了解form_with的最基本用法,我正在研究Rails如何在rails g脚手架过程中进行设置。

我创建了一个设备支架,并在其中研究了如何在_form.html.erb文件中设置表单。

<%= form_with(model: equipment, local: true) do |form| %>
  <div class="container">
    <div class="row">
      <div class="col col-lg-10 col-offset-left-1">
        <div class="form-group">
          <%= form.label :name %><br />
          <%= form.text_field :name, placeholder: "equipment name", class: "form-control" %>
        </div>
        </div>
      </div>
    </div>
  </div>
  <div class="actions">
    <%= form.submit %>
  </div>
<% end %>

原来,我仍然很困惑表单如何知道该表单应该创建新设备还是编辑现有设备?表单仅指定模型,但找不到指定方法的位置。

有人可以指出我正确的方向吗?谢谢

2 个答案:

答案 0 :(得分:3)

指定模型就足够了,因为方法form_with可以检查模型(已保存)是否将发送补丁请求,或者模型是新模型(因此将发送后期请求)。 活动记录已经具有一些功能可用于了解记录是新记录还是持久记录

 equipment.new_record? # returns true when the model is new and false if saved 
 equipment. persisted? # returns false when the model is new and true if saved 

此处的rails源代码显示 https://github.com/rails/rails/blob/c87f6841b77e5827ca7bd03a629e2d615fae0d06/actionview/lib/action_view/helpers/form_helper.rb#L1530 该方法还可以通过类似于path_for

的模型轻松知道请求的路径

答案 1 :(得分:1)

您的代码块:

<%= form_with(model: equipment, local: true) do |form| %>
  <div class="container">
    <div class="row">
      <div class="col col-lg-10 col-offset-left-1">
        <div class="form-group">
          <%= form.label :name %><br />
          <%= form.text_field :name, placeholder: "equipment name", class: "form-control" %>
        </div>
        </div>
      </div>
    </div>
  </div>
  <div class="actions">
    <%= form.submit %>
  </div>
<% end %>

将呈现如下内容:

<form action=”/equipments” accept-charset=”UTF-8" method=”post” data-remote=”true”>
 <input name=”utf8" type=”hidden” value=”✓”>
 <input type=”hidden” name=”authenticity_token” value=”…”>
 <input type=”text” name=”post[name]”>
 <input type=”submit” name=”commit” value=”Create” data-disable-with=”Create”>
</form>

现在,form_with视图助手使用该URL来了解model是什么值,并相应地呈现表单。

DHH发表了issue,解释了引入form_with的原因