25
votes

I have a user and a profile model. One user can have many profiles. I need to access only one information from the profiles section (viz the phone number) in my user model during the user creation process. Hence I'm trying to get it done through attr_accessible. My user.rb looks like this.

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

The problem that I'm facing is that when I try to call the getter method profile_mobile_number in a method in user.rb (the method is private, though I think it doesn't matter), I'm getting a null value. I use the following in my users/new.html.erb form

My question is what is the right way to do this? Should I use <% f.fields_for :profile do |ff| -%> or <% f.fields_for :profiles do |ff| -%> (notice that the second one is plural). When I use the plural :profiles, I don't even see the fields on the form. What am I missing here? And what is the tense that needs to be used in model user.rb? :profile_phone_number or :profiles_phone_number? Thanks.

4
Like I said I was using f.fields_for :profiles and the fields in the form weren't showing up. Turns out that I had to add @user.profiles.build in the controller. But now I'm not able to have both attr_accessible and accepts_nested_attributes_for in user.rb. The former overrides the latter. But I do want to have attr_accesible for the attributes of the user model while NOT restricting access to the attributes of the profile model. Any ideas? Thanks.Swamy g

4 Answers

21
votes

You could do something like the following:

<% 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 %>

But since you already have an association, then might as well use 'accepts_nested_attributes_for'

13
votes
3
votes

http://apidock.com/rails/v3.2.8/ActionView/Helpers/FormHelper/fields_for

This api dock link list many Nested Attributes Examples including one-to-one, one-to-many. It's very helpful!

0
votes

You can use 'accepts_nested_attributes_for' to do this; but there's a little trick in forms:

You must use the singular, and call fields_for for each profile, like this:

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

Notice that is :profile_attributes, instead of just :profile.