2010-05-21 23 views
21

Tôi đã cố tạo một biểu mẫu phức tạp với nhiều mô hình lồng nhau và làm cho nó trở nên năng động. Bây giờ tôi thấy rằng làm cho một mô hình lồng nhau không phải là khó khăn với accept_nested_attributes_for, nhưng làm cho nó lồng nhau và năng động dường như là không thể nếu có nhiều mô hình lồng nhau.Rails fields_for: child_index giải thích tùy chọn

Tôi đã xem qua số http://github.com/ryanb/complex-form-examples/blob/master/app/helpers/application_helper.rb, nó rất thanh lịch. Bất cứ ai có thể làm sáng tỏ một số dòng 13 và 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| 

Từ trực giác, dòng 13 instantiates một đối tượng mới, nhưng tại sao nó phải làm rất nhiều cuộc gọi phương pháp? Tôi không thể tìm thấy bất kỳ tài liệu nào cho tùy chọn: child_index trên dòng 16. Khi biểu mẫu được tạo, một số rất lớn được sử dụng làm chỉ mục cho các mô hình mới, trong khi các mô hình hiện có được lập chỉ mục theo id của chúng. Cái này hoạt động ra sao?

Trả lời

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

Nếu đối tượng không được truyền làm tham số, nó sẽ tạo đối tượng mới của lớp tương ứng.

form_builder.object được các đối tượng chính từ hình thức (project)

form_builder.object.class được các lớp học (Project)

method là tên hiệp hội cho Dự án (:tasks)

reflect_on_association(method) cho AssociationReflection đối tượng.

reflect_on_association (phương pháp). klass trả về lớp của hiệp hội. (Task)

Và, cuối cùng, klass.new tạo ra một trường hợp mới (Task.new => nhiệm vụ mới)

Nó được thực hiện theo cách này vì tên hiệp hội không phải lúc nào cũng chỉ là một tên lớp số nhiều như trong trường hợp này (Nhiệm vụ -: nhiệm vụ), nhưng nó là cần thiết để có được đối tượng lớp để tạo ra trường hợp mới của nó.

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

:child_index tùy chọn cho phép bạn xác định các chỉ số của đối tượng cụ thể:

project[tasks_attributes][:child_index][field_name] 

Nó được thiết lập để ` "_ # {phương pháp} mới" của Rails, nhưng sau đó được thay thế bằng javascript (ứng dụng. 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) 
    }); 
} 

Chỉ mục được đặt thành số lớn không xung đột với các mục hiện có. Chúng không được lập chỉ mục theo id theo cách này, chỉ từ 0 đến count-1

+0

Làm cách nào Rails biết những gì cần xóa trong cơ sở dữ liệu nếu nó được lập chỉ mục từ 0 đến đếm - 1? Tôi đang thiếu một cái gì đó. – Timothy

+4

Nó chèn trường ẩn cho mỗi bản ghi, chứa id của nó: ''. Bạn nên xem nguồn HTML để hiểu, những gì Rails tạo ra. – Voyta

+0

giải thích tuyệt vời. cảm ơn. – user938363

Các vấn đề liên quan