2010-02-12 38 views
18

Tôi có một người dùng và một mô hình tiểu sử. Một người dùng có thể có nhiều hồ sơ. Tôi chỉ cần truy cập một thông tin từ phần hồ sơ (viz số điện thoại) trong mô hình người dùng của tôi trong quá trình tạo người dùng. Do đó tôi đang cố gắng hoàn thành nó qua attr_accessible. My user.rb trông như thế nàyCác biểu mẫu lồng nhau trong đường ray - thuộc tính truy cập trong quan hệ has_many

has_many :profiles 
attr_accessible :handle, :email, :password, :profile_mobile_number 
attr_accessor : :profile_mobile_number 

Vấn đề mà tôi phải đối mặt là khi tôi cố gắng gọi phương thức getter profile_mobile_number trong một phương pháp trong user.rb (method là private, mặc dù tôi nghĩ rằng nó không quan trọng), tôi m nhận giá trị null. Tôi sử dụng thông tin sau đây trong người dùng của tôi/new.html.erb form

Câu hỏi của tôi là cách thích hợp để làm điều này? Tôi có nên sử dụng <% f.fields_for :profile do |ff| -%> hoặc <% f.fields_for :profiles do |ff| -%> (thông báo rằng số thứ hai là số nhiều). Khi tôi sử dụng số nhiều: tiểu sử, tôi thậm chí không thấy các trường trên biểu mẫu. Tôi đang thiếu gì ở đây? Và những gì là căng thẳng mà cần phải được sử dụng trong mô hình user.rb? : profile_phone_number hoặc: profiles_phone_number? Cảm ơn.

+0

Như tôi đã nói tôi đã sử dụng f.fields_for: tiểu sử và các trường trong biểu mẫu không hiển thị. Hóa ra tôi phải thêm @ user.profiles.build vào bộ điều khiển. Nhưng bây giờ tôi không thể có cả attr_accessible và accept_nested_attributes_for trong user.rb. Các cựu ghi đè sau này. Nhưng tôi muốn có attr_accesible cho các thuộc tính của mô hình người dùng trong khi không hạn chế quyền truy cập vào các thuộc tính của mô hình hồ sơ. Bất kỳ ý tưởng? Cảm ơn. –

Trả lời

16

Bạn có thể làm một cái gì đó như sau:

<% form_for @user, :url => { :action => "update" } do |user_form| %> 
    ... 
    <% user_form.fields_for :profiles do |profiles_fields| %> 
    Phone Number: <%= profiles_fields.text_field :profile_mobile_number %> 
    <% end %> 
<% end %> 

Nhưng kể từ khi bạn đã có một hiệp hội, sau đó cũng có thể sử dụng 'accepts_nested_attributes_for'

+6

Điều đáng nói đến là việc này lặp lại các đối tượng liên quan đã tồn tại. Tuy nhiên, nó không tạo ra bản ghi trống mới nào. Sử dụng trình trợ giúp cho bản ghi nối thêm bản ghi mới nếu không có bản ghi nào trong hiệp hội, ví dụ: "def setup_profiles (người dùng); user.profiles.build nếu user.profiles.blank? ||! User.profiles.map (&: new_record?) .any ?; user; end ", sau đó sử dụng" form_for setup_profiles (@user) làm ... " – hurikhan77

+1

@ hurikhan77 bình luận là rất quan trọng! Bạn cần phải xây dựng một đối tượng mới nếu không tồn tại các đối tượng liên quan, nếu không sẽ không có gì xuất hiện trong biểu mẫu của bạn! – agmin

0

Bạn có thể sử dụng 'accepts_nested_attributes_for' để làm điều này; nhưng có một mẹo nhỏ dưới các hình thức:

Bạn phải sử dụng ít, và gọi fields_for cho mỗi hồ sơ, như thế này:

<% form_for @user do |f| -%> 
<% @user.profiles.each do %> 
<% f.fields_for :profile_attributes, profile do |ff| -%> 
<% end %> 

ý rằng là : profile_attributes, thay vì chỉ : hồ sơ .

+3

Nếu là liên kết * thuộc về đa hình *, bạn phải xác định phương thức * build_profile * trong Mô hình người dùng của mình. – nanda

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