1

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[],显然我们期待一个ids 数组,那么为什么它只检查一个对象并将其分配给自动索引,而不是抓取用户对象的集合并分配它们的所有 id自动索引?

请参阅第 1197 行:

https://github.com/rails/rails/blob/master/actionpack/lib/action_view/helpers/form_helper.rb

4

0 回答 0