options[:object] ||= form_builder.object.class.reflect_on_association(method).klass.new
Если объект не передается в качестве параметра, создается новый объект соответствующего класса.
form_builder.object
получает основной объект из формы (project
)
form_builder.object.class
получает свой класс (Project
)
method
- название ассоциации для Проекта (:tasks
)
refle_on_association (метод) дает AssociationReflection объект.
refle_on_association (метод). класс возвращает класс ассоциации. (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, но затем заменяется на 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