has_one relation and form_for

136 views
Skip to first unread message

Jean

unread,
Nov 5, 2012, 2:32:19 PM11/5/12
to rubyonra...@googlegroups.com
Hello everybody. I have two models user and user_information. the User has_one user_information and the UserInformation belongs_to user. Now I need to make a form_for to create the user information for an user. So I go to the following link: http://localhost:3000/users/1/user_informations/new a fill the form, with the user_id, and the other fields. But I get the following error:

Can't mass-assign protected attributes: user_id

I think the error is in the user_information#new view, in the form_form. This is the actual form
<%= form_for(@user_information) do |f| %>
<%= f.text_field :user %>
  </div>
  <div class="field">
    <%= f.label :address %><br />
    <%= f.text_field :address %>
  </div>
  <div class="field">
    <%= f.label :phone %><br />
    <%= f.text_field :phone %>
  </div>
  <div class="field">
    <%= f.label :business %><br />
    <%= f.check_box :business %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

I think the form_for should be something like <%= form_for([@user_information, @user.user_information.bluild]) do |f| %> but it doesn't work. So I really really need your help, please. 

Tommaso Visconti

unread,
Nov 5, 2012, 4:24:10 PM11/5/12
to rubyonra...@googlegroups.com
Jean ha scritto:
> Can't mass-assign protected attributes: user_id

to solve this you need:

attr_accessible :user_id

in the UserInformation model, but you're using nested resources, so I'd
prefer something like:

# UserInformationController #

def new
@user = User.find(params[:id])
@user_information = @user.user_information.build
end

def create
@user = User.find(params[:id])
@user_information = UserInformation.new(params[:user_information])
@user_information.user = @user
@user_information.save
end

take a look here:
http://stackoverflow.com/questions/2034700/form-for-with-nested-resources

Jean

unread,
Nov 5, 2012, 5:02:26 PM11/5/12
to rubyonra...@googlegroups.com
Thanks Tomas. I tried this way, but then I get this error:

NoMethodError in UserInformationsController#new

undefined method `build' for nil:NilClass

Tommaso Visconti

unread,
Nov 5, 2012, 5:53:14 PM11/5/12
to rubyonra...@googlegroups.com
Jean ha scritto:
> Thanks Tomas. I tried this way, but then I get this error:
>
>
> NoMethodError in UserInformationsController#new
>
> undefined method `build' for nil:NilClass

yeah, sorry, for has_one relation the correct statement is:

def new
@user = User.find(params[:id])
@user_information = @user.build_user_information
end

Jean

unread,
Nov 5, 2012, 6:08:36 PM11/5/12
to rubyonra...@googlegroups.com
Thanks Tommaso, It works, but the user_id has this User:0x007fe37d33b5e0 no User:1, is that ok???

Tommaso Visconti

unread,
Nov 6, 2012, 3:35:19 AM11/6/12
to rubyonra...@googlegroups.com
Jean ha scritto:
> Thanks Tommaso, It works, but the user_id has this User:0x007fe37d33b5e0
> no User:1, is that ok???

Don't confuse the actual data (saved on db) and the representation of it
in the views. You see the representation of the User model, which is
composed of user attributes (like @user.id, etc.).
My advice is to play with rails console to clarify your doubts
Reply all
Reply to author
Forward
0 new messages