f.object 在 Rails 表单生成器中做什么?

What does f.object do in the Rails form builder?

我正在通过教程学习 Rails 5.0,在该教程中它使用了 f.object,我对此并不熟悉。 f.object 被传递到 ERb,传递到处理错误处理的方法中。

我知道 f 是传递到表单中的记录的 object/instance。但是我不明白的是 f.object.

edit.html.erb(带格式的文件):

<%= form_for(@section) do |f| %>

<%= error_messages_for(f.object) %>
  <table summary="Subject form fields">
    <tr>
      <th>Name</th>
      <td><%= f.text_field(:name) %></td>
    </tr>
    <tr>
      <th>Position</th>
      <td><%= f.select(:position, 1..@subject_count) %></td>
    </tr>
   </table>
<% end %>

没有称为 object 的 HTML 表单元素,这通常是在 f. 之后出现的元素,因此对它可能是什么感到非常恼火。

f.object 指的是作为参数传递给 form_for 方法的对象。

在你的例子中 f.object returns @section.

"f" 是表单块中使用的局部变量。该表单包含一个对象 (@section),如果发生错误,您将该对象传递给一个错误部分,该部分检查是否有任何错误并呈现该对象为您创建的错误消息。 在我的表格中,我通常会添加这样的错误部分:

  <%= render "shared/error_messages", object: f.object %>

在你的部分错误中它看起来有点像这样 (_error_messages.html.erb):

<% if object.errors.any? %>   # object in this case is @section
  <ul>
    <% object.errors.full_messages.each do |msg| %>
    <li><%= msg %></li>
    <% end %>
  </ul>
</div>
<% end %> 

这确实只是一种将带有错误的表单对象传递给局部对象以正确显示它的方法。没有html涉及。

these two 问题中所述:

f.objectform_for returns 表单正在使用的模型对象中。

在这种情况下:@section

代码是here,里面是rails/actionview/lib/action_view/helpers/active_model_helper.rb,显然没有注释:

    module ActiveModelInstanceTag
      def object
        @active_model_object ||= begin
          object = super
          object.respond_to?(:to_model) ? object.to_model : object
        end
      end
      ...

总结:f.object是您正在使用的记录:@section

好的,你还在吗?在我快速浏览了源代码之后,这里有一些关于发生了什么的解释:

fform builder object。表单生成器有一个 @object 实例变量。如果您正在使用 form_for 中的记录,则该记录将变为 @object。如果在使用 form_for 时使用字符串,则 f.object 应该为 nil。但在您的情况下,您使用的是一条记录,因此 f.object 将是一条记录。

恕我直言,我无法按照当前接受的答案中的执行路径进行操作。当您使用 form_for 方法时,object passed in is simply the first parameter passed in, and that is what is used to create the form_builder object 将用于实例化 @object 变量。