Search code examples
ruby-on-railsruby-on-rails-3.2mass-assignment

Mass assignment error with nested fields_for


I know this question has been asked a bunch of times. I already have nested fields_for in my app many times w/o issue so I'm confused as to why its not working this time. I apologize for bringing this topic up again.

I have a user model. A user can have many accounts. To prevent a user from existing w/o at least one account I have a semantic_fields_for nested in the new user form with just one input for setting account role_id.

class User

    attr_accessible :accounts_attributes
    has_many :accounts, :dependent => :destroy
    accepts_nested_attributes_for :accounts

class Account

    attr_accessible :role_id, :user_id, :status
    belongs_to :role
    belongs_to :user

users/new

    <%= f.semantic_fields_for :accounts do |account| %>
    <%= account.input :role, :as => :select, :collection => @roles, :label => "Account" %>
    <% end %>

So, to recap: I have the association set up between users and accounts, users model includes accepts_nested_attributes_for, users model includes attr_accessible :accounts_attributes, semantic_fields_for is set up correctly. The error I get is:

Can't mass-assign protected attributes: accounts

The stack trace from the submitted form includes all the correct variables. Account role_id is being set correctly by the nested attribute. The record is simply being rejected for mass-assignment error but it sure seems my attributes are all properly protected.

Using Rails 3.2.3 and Formtastic 2.2.

EDITED

class UsersController

def new

  @user = User.new         
  @user.accounts.build

end

users/new

    <%= semantic_form_for :user, :url => users_path do |f| -%>
    
    <%= f.inputs do %>
        <%= f.input :name %>
        <%= f.input :username %>
    <%= f.input :email %>   
        <%= f.input :password, :as => :password %>
        <%= f.input :password_confirmation, :label => "Confirm Password", :as => :password %>
    <%= f.input :school_id, :as => :hidden, :input_html => {:value => @school.id} %>        

        <%= f.semantic_fields_for :accounts do |account| %>
          <%= account.input :role_id, :as => :select, :collection => @roles %>
        <% end %>

    <%- end -%> <%# END f.inputs do %>
      <%= submit_tag 'Create User', :class => "button" %>
    <%- end -%> <%# END form %>

Solution

  • GOT IT!! I removed :url => and changed :user to @user in the semantic_form_for block... I guess the way I had it was causing the params[:account] to set off mass assignment