Reputation: 629
I keep getting an unknown attributes error, though I have tried some of the similar answers to this question here. I am trying to update council and property attributes into a join table council history using a nested form, when I try to load the view form I get this error please advice what you think I might be doing wrong am new to rails and programming.
Error
Started PUT "/properties/6/build/council" for 127.0.0.1 at 2013-08-19 17:35:45 +0100
Processing by Properties::BuildController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"wBWQaxtBioqzGLkhUrstqS+cFD/xvEutXnJ0jWNtSa0=", "property"=> {"council_history_attributes"=>{"council_id"=>""}}, "commit"=>"Create Council history", "property_id"=>"6", "id"=>"council"}
Property Load (0.3ms) SELECT "properties".* FROM "properties" WHERE "properties"."id" = ? LIMIT 1 [["id", "6"]]
(0.1ms) begin transaction
(0.1ms) rollback transaction
Completed 500 Internal Server Error in 6ms
ActiveRecord::UnknownAttributeError - unknown attribute: council_history_attributes:
activerecord (3.2.13) lib/active_record/attribute_assignment.rb:88:in `block in assign_attributes'
activerecord (3.2.13) lib/active_record/attribute_assignment.rb:78:in `assign_attributes'
activerecord (3.2.13) lib/active_record/persistence.rb:216:in `block in update_attributes'
activerecord (3.2.13) lib/active_record/transactions.rb:313:in `block in with_transaction_returning_status'
activerecord (3.2.13) lib/active_record/connection_adapters/abstract/database_statements.rb:192:in `transaction'
activerecord (3.2.13) lib/active_record/transactions.rb:208:in `transaction'
activerecord (3.2.13) lib/active_record/transactions.rb:311:in `with_transaction_returning_status'
activerecord (3.2.13) lib/active_record/persistence.rb:215:in `update_attributes'
app/controllers/properties/build_controller.rb:24:in `update'
Property Model
class Property < ActiveRecord::Base
attr_accessible :name, :address_attributes, :tenants_attributes, :meter_attributes, :council_history, :council_history_attributes, :property_id, :council_id, :status
belongs_to :user
has_one :council_history
has_one :council, through: :council_history, :foreign_key => :council_id
accepts_nested_attributes_for :council
end
Council Model
class Council < ActiveRecord::Base
attr_accessible :CouncilEmail, :name, :CouncilTel
has_many :council_history
has_many :properties, :through => :council_history, :foreign_key => :property_id
end
Council History Model -- Join Table
class CouncilHistory < ActiveRecord::Base
attr_accessible :council_id, :property_id, :vacant
belongs_to :council
belongs_to :property
end
*View *
<%= simple_form_for @property, :url => url_for(:action => 'update', :controller => 'properties/build'), :method => 'put' do |f| %>
<%= f.simple_fields_for :council do |builder| %>
<%= builder.input :council_id, :collection => Council.all %>
<%= builder.submit %>
<% end %>
<% end %>
Property/build Controller
class Properties::BuildController < ApplicationController
include Wicked::Wizard
steps :tenant, :meter, :council, :confirmed
def show
@property = Property.find(params[:property_id])
@tenants = @property.tenants.new(params[:tenant_id])
@meter = @property.build_meter
@council = @property.build_council
@council_history = @property.council_history.build
render_wizard
end
def edit
@property = Property.find(params[:property_id])
end
def update
@property = Property.find(params[:property_id])
params[:property][:status] = step.to_s
params[:property][:status] = 'active' if step == steps.last
@property.update_attributes(params[:property])
render_wizard @property
end
Upvotes: 1
Views: 1201
Reputation: 344
Thanks for the answer Muntasim. I can't comment directly on the accepted answer but, wanted to update how to do this now that attr_accessible is no longer in Rails (last version v2.3.8) with the introduction of strong parameters in Rails 4+.
Strong parameters in controllers,
def person_params
params.permit(:name, {:emails => []}, :friends => [ :name, { :family => [ :name ], :hobbies => [] }])
end
Strong parameters can be used outside of controllers (this is the issue that I was running into that led me here),
raw_parameters = { :email => "[email protected]", :name => "John", :admin => true }
parameters = ActionController::Parameters.new(raw_parameters)
user = User.create(parameters.permit(:name, :email))
Alternatively if you want to use attr_accessible, you still can, see this answer.
If you want to use attr_accessible, you need to add protected_attributes to your Gemfile. Otherwise, you will be faced with a RuntimeError.
Upvotes: 0
Reputation: 6786
add accepts_nested_attributes_for :council_history
class Property < ActiveRecord::Base
attr_accessible :name, :address_attributes, :tenants_attributes, :meter_attributes, :council_history, :council_history_attributes, :property_id, :council_id, :status
belongs_to :user
has_one :council_history
has_one :council, through: :council_history, :foreign_key => :council_id
accepts_nested_attributes_for :council
accepts_nested_attributes_for :council_history #add this line
end
Upvotes: 3