2011-12-09 28 views
8

Tôi muốn hiểu cách "thích hợp" để khởi tạo các trường lồng nhau của một mô hình.Cách thích hợp để khởi tạo các trường lồng nhau trong các dạng Rails

Hãy nói rằng bạn có một số các trường lồng nhau cho một mô hình:

class User 

    has_one :address 
    accepts_nested_attributes_for :address 
end 

Và bạn cần phải khởi tạo những thuộc tính (address trong trường hợp này) để sử dụng chúng trong một cuộc gọi fields_for.

Cho đến nay tôi đã nghĩ đến ba cách để thực hiện việc này.

Thứ nhất, after_initialize móc trên mô hình:

class User 
    after_initialize :init_address 

    protected 
    def init_address 
    address ||= build_address 
end 

Sau đó, chúng tôi có khởi trong bộ điều khiển:

class UsersController 
    def new  
    @user = User.new 
    @user.build_address 
    end 
end 

Và cuối cùng, chúng ta có thể có một phương pháp helper để làm điều đó cho chúng ta:

module FormHelpers 
    def setup_user(user) 
    user.address ||= user.build_address 
    user 
    end 
end 

# view 

<%= form_for setup_user(@user)... %> 

Có điều gì giống như tiêu chuẩn hay "thực hành tốt nhất" cho lần thứ là kịch bản? Làm thế nào để bạn làm điều đó và tại sao?

+0

Trong việc thiếu một giải pháp tốt hơn, tôi đã kết thúc bằng văn bản một đá quý mà sẽ chăm sóc này: https://github.com/febuiles/auto_build –

+0

Hình như một bài cũ. Bạn đang sử dụng phiên bản Rails nào? –

Trả lời

0

tôi tin rằng build_address đã được tạo sẵn cho đường ray sau khi bạn khai báo một liên kết has_one, vì vậy bạn không cần phải viết chính bản thân bit đó. và nếu biểu mẫu chỉ được gọi từ hành động mới, những gì bạn thực sự cần chỉ là bit điều khiển và không có gì khác

+0

Có lỗi đánh máy trong mã, thay vì 'build_address', phương thức này nên được gọi là' init_address'. Hy vọng nó rõ ràng hơn bây giờ. –

+0

Tôi nghĩ đó là '@ user.addresses.build'? –

+0

@macek: Đối với một mục (has_one relationship) bạn sử dụng build_field. Đối với nhiều mục (has_many) bạn sử dụng fields.build. –

2

Tôi nghĩ rằng nếu thuộc tính lồng nhau không có ý nghĩa gì nếu không có mô hình gốc, tòa nhà và khởi tạo các mô hình lồng nhau này sẽ là trách nhiệm của mô hình cha mẹ.

Tôi không hiểu tại sao UsersController nên quan tâm đến cách @user.addresses được tạo hoặc được khởi tạo. Đối với tôi, đưa cho bộ điều khiển trách nhiệm này, có thể ngụ ý rằng trên create anh ta nên là người phân tích cú pháp và xây dựng các thuộc tính lồng nhau (trong đó, xảy ra trong mô hình).

Tôi sẽ tiếp cận phương pháp đầu tiên.

+0

Cách tiếp cận đầu tiên không thành công trong trường hợp các hình thức lồng nhau. Đối tượng lồng nhau được khởi tạo lại và biểu mẫu lồng nhau có thể thất bại. – Bot

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