Sasha
Sasha

Reputation: 6466

Nested Form -- Can't mass assign protected attribute

I'm a little stumped by this one, cause I feel like I've dodged the common errors (like mistyping the attr_accessible, or leaving it out altogether), but I'm still getting a

Can't mass-assign protected attributes: home, work

error here. I'm guessing I'm missing something, but I'm not sure what.

At any rate, in my new app, Users have one Home and one Work (which each belong to a user), and I want users to enter them on signing up. So, in my models:

user.rb

attr_accessible :email, :first_name, :last_name, :password, :password_confirmation, :home_attributes, :work_attributes

  has_one :home, :work

  accepts_nested_attributes_for :work, :home

  has_secure_password

home.rb

attr_accessible :address, :latitude, :longitude, :user_id
belongs_to :user

validates :address, presence: true

work.rb

attr_accessible :address, :latitude, :longitude, :user_id
belongs_to :user

validates :address, presence: true

in my controller

users_controller.rb

def new
    @user = User.new

  respond_to do |format|
    format.html # new.html.erb
    format.json { redirect_to @user }
  end
end

and in my form:

views/users/_form.html.haml

= form_for @user do |f|
  - if @user.errors.any?
    .error_explanation
      %h2
        = pluralize(@user.errors.count, "error") 
        prohibited this post from being saved:
      %ul
        - @user.errors.full_messages.each do |msg|
          %li= msg

  = f.label :first_name
  = f.text_field :first_name

  = f.label :last_name
  = f.text_field :last_name

  = f.label :email
  = f.text_field :email

  = f.label :password
  = f.password_field :password

  = f.label :password_confirmation, "Re-Enter Password"
  = f.password_field :password_confirmation

  = f.fields_for :home do |builder|
    = builder.label :address, "Home address"
    = builder.text_field :address
  %br
  = f.fields_for :work do |builder|
    = builder.label :address, "Work address"
    = builder.text_field :address

  .btn-group
    = f.submit 'Sign Up!', class: "btn"

Upvotes: 4

Views: 1234

Answers (1)

muttonlamb
muttonlamb

Reputation: 6501

It looks like you haven't set up your instance variable to include those attributes.

In your controller you should have something like this

def new
    @user = User.new
    @user.homes.build
    @user.works.build

  respond_to do |format|
    format.html # new.html.erb
    format.json { redirect_to @user }
  end
end

If you don't build those attributes the form doesn't know what to do.

Edit: Fixed syntax for building nested resource

Upvotes: 3

Related Questions