Reputation: 3509
I have a Product
model which has many Categories
and a Category
has many Attributes
.
class Product < ActiveRecord::Base
has_many :categories, :dependent => :destroy
accepts_nested_attributes_for :categories, :reject_if => lambda { |a| a[:name].blank? }, :allow_destroy => true
attr_accessible :categories_attributes, :comments, :name, :price, :available, :image, :remote_image_url
end
class Category < ActiveRecord::Base
belongs_to :product
has_many :attributes, :dependent => :destroy
attr_accessible :name, :attributes_attributes
accepts_nested_attributes_for :attributes, :reject_if => lambda { |a| a[:name].blank? }, :allow_destroy => true
end
class Attribute < ActiveRecord::Base
belongs_to :category
attr_accessible :name, :value, :is_key
end
My problem is that, when I try updating the Product
model, I get the following error:
undefined method `keys' for []:ActiveRecord::Relation
I have no keys
attribute in any model, but I do have is_key
in the Attribute
model, so I am thinking that is where the problem comes from.
I am using the following form for the Product
update:
.form_container
= nested_form_for @product, :html => {:class => 'form'} do |f|
- if @product.errors.any?
#error_explanation
%h2= "#{pluralize(@product.errors.count, "error")} prohibited this product from being saved:"
%ul
- @product.errors.full_messages.each do |msg|
%li= msg
.title
Product fields
.field
= f.label :name
= f.text_field :name, :class => :required
.field
= f.label :price
= f.text_field :price, :class => :required
.field
= f.label :comments
= f.text_area :comments
.field
= f.label :product_type
= select_tag 'product_type', options_from_collection_for_select(@product_types, 'id', 'name'), { :class => '' }
%br/
.title
Image
.field
= f.file_field :image, :class => :file
.field
= f.label :remote_image_url, 'or image URL'
= f.text_field :remote_image_url
%br/
.title
Specifications
.field
= f.fields_for :categories do |category|
= render 'category_fields', :f => category
.field
= f.link_to_add "Add a category", :categories, :class => 'button_link'
.field
= f.label :available
= f.check_box :available, {checked: true}
.actions
= f.submit submit_button_name, :class => :submit
Upvotes: 0
Views: 674
Reputation: 8065
Change this line
has_many :attributes, :dependent => :destroy
to
has_many :category_attributes, :dependent => :destroy, :class_name => 'Attribute'
along with rest attr_accessible
etc. to avoid conflict with build in attributes rails method
Upvotes: 1