我正在从一个教程学习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.
之后通常会发生这种情况,所以对它可能是什么感到非常恼火。
答案 0 :(得分:6)
f.object
指的是作为参数传递给form_for
方法的对象。
在您的示例中f.object
返回@section
。
答案 1 :(得分:3)
&#34;的˚F强>&#34;是表单块中使用的局部变量。表单包含一个对象(@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。
答案 2 :(得分:2)
f.object
内的 form_for
返回表单正在使用的模型对象。
在这种情况下:@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
...
答案 3 :(得分:0)
Categorie.aggregate([
{$match: {leverancier: leverancier}},
{
$lookup: {
from: "voorraads", // collection of model Voorraad
localField: "_id",
foreignField: "categorie",
as: "voorraad"
}
}
])
是您正在使用的记录:@section 好的,你还在吗?在我快速浏览了源代码之后,这里有一些关于发生的事情的解释:
f.object
是form builder object。表单构建器具有一个f
实例变量。如果您在form_for中使用记录,那么该记录将变为@object
。如果在使用form_for时使用字符串,则@object
将为nil。但是在您的情况下,您正在使用记录,因此f.object将成为记录。
以最大的敬意,我无法遵循当前接受的答案中的执行路径。当您使用f.object
方法时,form_for
passed in is simply the first parameter passed in就是is used to create the form_builder object的内容,然后将其用于实例化object
变量。