gpt4 book ai didi

ruby-on-rails - Rails fields_for :child_index option explanation

转载 作者:行者123 更新时间:2023-12-03 10:38:15 25 4
gpt4 key购买 nike

我一直在尝试使用许多嵌套模型创建一个复杂的表单,并使其动态化。现在我发现使用accepts_nested_attributes_for 制作嵌套模型并不困难,但是如果有多个嵌套模型,则制作嵌套和动态似乎是不可能的。

我遇到了http://github.com/ryanb/complex-form-examples/blob/master/app/helpers/application_helper.rb这样做非常优雅。有人能解释一下第 13 行和第 16 行吗?

13 form_builder.object.class.reflect_on_association(method).klass.new


16 form_builder.fields_for(method, options[:object], :child_index => "new_#{method}") do |f|

从直觉上看,第 13 行实例化了一个新对象,但为什么它必须进行如此多的方法调用?我在第 16 行找不到关于 :child_index 选项的任何文档。创建表单时,使用非常大的数字作为新模型的索引,而现有模型按其 id 进行索引。这是如何运作的?

最佳答案

options[:object] ||= form_builder.object.class.reflect_on_association(method).klass.new

如果对象没有作为参数传递,它会创建一个对应类的新对象。
form_builder.object从表单中获取主要对象 ( project )
form_builder.object.class获取它的类( Project )
method是项目的关联名称 ( :tasks )

reflect_on_association(method)AssociationReflection目的。

反射(reflect)_on_association(方法)。 klass返回关联的类。 ( Task )

最后, klass.new 创建一个新实例( Task.new => 新任务)

这样做是因为关联名称并不总是像这种情况下的复数类名称 (Task - :tasks),但有必要获取类对象以创建它的新实例。
form_builder.fields_for(method, options[:object], :child_index => "new_#{method}") do |f|
:child_index选项允许您指定特定对象的索引:
project[tasks_attributes][:child_index][field_name]

它被 Rails 设置为 `"new_#{method}",但随后被 javascript (application.js) 替换:
function insert_fields(link, method, content) {
var new_id = new Date().getTime();
var regexp = new RegExp("new_" + method, "g")
$(link).up().insert({
before: content.replace(regexp, new_id)
});
}

索引设置为一个很大的数字只是为了不与现有项目冲突。顺便说一下,它们不是按 id 索引的,只是从 0 到 count-1

关于ruby-on-rails - Rails fields_for :child_index option explanation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2879208/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com