我正在通过教程学习Rails 5.0,在该教程中它使用了我不熟悉的
f.object
。 f.object
被传递到 ERb 中,传递到处理错误处理的方法中。
我知道
f
是传递到表单中的记录的对象/实例。但我不明白的是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
中表单生成器<%= form_for(@section) do |f| %>
方法的对象。
在您的示例中,
f.object
返回@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。
f.object
中的 form_for
返回表单正在使用的模型对象。
在这种情况下:
@section
代码在这里,在
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好的,你还在吗?在我快速浏览了源代码之后,这里对正在发生的事情进行了更多解释:
f
是一个表单构建器对象。表单构建器有一个 @object
实例变量。如果你在form_for中使用一条记录,那么该记录将变成@object
。如果您在使用 form_for 时使用字符串,那么 f.object
应该为零。但就您而言,您使用的是记录,因此 f.object 将是一条记录。
恕我直言,我无法遵循当前接受的答案中的执行路径。当您使用
form_for
方法时,传入的 object
只是传入的第一个参数,这就是 用于创建 form_builder 对象,然后使用该对象实例化 @object
变量。