ActionView::Base
实例方法form_for
可以接受一个字符串作为它的第一个参数。有时您想在一个编辑表单中一次更新多个对象。因此,您可以将字符串作为第一个参数传递form_for
给与对象名称连接的一组方括号(例如person[]
)。然后,您可以遍历人员对象数组并调用其FormBuilder
上的实例方法,例如text_field
,传递与人员对象关联的属性。这很好,可以理解。
但是,我正在查看源代码,我遇到了这个:
if @object_name.to_s.match(/\[\]$/)
if object ||= @template.instance_variable_get("@#{Regexp.last_match.pre_match}") and object.respond_to?(:to_param)
@auto_index = object.to_param
else
raise ArgumentError, "object[] naming but object param and @object var don't exist or don't respond to to_param: #{object.inspect}"
end
end
@object_name
是传递给 的构造函数的参数FormBuilder
,它指的是传递给 的第一个参数form_for
,例如user[]
. 在这里,我们检查字符串是否包含方括号,如果包含,我们检查模板ActionView::Base
以查看它是否包含@user
实例变量(Regexp.last_match.pre_match
返回user
,然后我们只需插入@
以构建实例变量)。请记住,实例变量是从控制器复制到视图层的,因此如果我们在控制器中定义了它,它将在ActionView
. 因此,假设因为我们处于编辑表单中,所以我们确实有一个@user
存在的对象。在这里,我们调用它的to_param
方法,它将id
记录的作为字符串返回(假设to_param
没有被覆盖)并将其分配给@auto_index
实例变量。
这是我的问题。假设它@user
确实存在并且具有1
分配给的 id @auto_index
。但是如果我们正在检查一个带有方括号的字符串user[]
,显然我们期待一个id
s 数组,那么为什么它只检查一个对象并将其分配给自动索引,而不是抓取用户对象的集合并分配它们的所有 id自动索引?
请参阅第 1197 行:
https://github.com/rails/rails/blob/master/actionpack/lib/action_view/helpers/form_helper.rb