Jim Miller
2013-Nov-07 21:40 UTC
grouped_collection_select for has_many :through Association not Updating
I have a scenario where I created a few has_many :through associations which I am having trouble updating. I do appreciate any help! Thank you! Here is my setup: ruby 1.9.3p392 Rails 3.2.13 Here is the scenario: I have 3 models that are related There are many Industries, many Keywords, and many Conferences Industries have many Keywords Conferences have an Industry Conferences choose Keywords based on its Industry Keywords has a basic CRUD model. Creating an Industry then adding Keywords works fine. My relationship for Conferences, Industries, and Keywords is where I am having issues. I am trying to update Conference information, change the Industry that it is currently associated with, choose new Keywords based on the new Industry all in the same form. When I remove the Keywords element out of the mix, the update works. But when all three are there, then I get the errors. The view renders fine but when I submit a change, I get an error. The error that I am seeing is: **Couldn''t find Industry with ID=3 for Conference with ID=1** My relationship for Industries and Keywords are: ******************************************************* class IKeywordable < ActiveRecord::Base attr_accessible :industry_id, :keyword_id belongs_to :industry belongs_to :keyword end class CKeywordable < ActiveRecord::Base attr_accessible :conference_id, :keyword_id belongs_to :conference belongs_to :keyword end ******************************************************** Here are the Models: ******************************************************** class Industry < ActiveRecord::Base attr_accessible :name, :conferences_attributes, :i_keywordables_attributes, :keywords, :keywords_attributes, :keyword_ids validates :name, presence: true validates :name, uniqueness: true # Associations has_many :conferences accepts_nested_attributes_for :conferences #Keywords has_many :i_keywordables has_many :keywords, through: :i_keywordables accepts_nested_attributes_for :i_keywordables accepts_nested_attributes_for :keywords end class Keyword < ActiveRecord::Base attr_accessible :name, :profile_id, :active, :rating, :c_keywordables_attributes, :i_keywordables_attributes, :industries_atributes # Associations #Industries has_many :i_keywordables has_many :industries, through: :i_keywordables accepts_nested_attributes_for :i_keywordables #Conferences has_many :c_keywordables has_many :conferences, through: :c_keywordables accepts_nested_attributes_for :c_keywordables end class Conference < ActiveRecord::Base attr_accessible :name, :address1, :address2, :city, :email, :web, :profile_id, :state_id, :conference, :description, :date_start, :date_end, :venue, :venue_web, :organizer, :organizer_web, :c_keywordables_attributes, :industry_attributes, :industry_id, :industry, :keyword_ids # Associations belongs_to :state belongs_to :industry accepts_nested_attributes_for :industry #Keywords has_many :c_keywordables has_many :keywords, through: :c_keywordables accepts_nested_attributes_for :c_keywordables serialize :keywords, Array def to_s state_id end end ******************************************************** Here is the Conference/edit.html.erb ******************************************************** <h2>edit <%= @conference.name %></h2> <%= form_for @conference do |c| %> <%= c.label :name %> <%= c.text_field :name %> <%= c.label :address1 %> <%= c.text_field :address1 %> <%= c.label :address2 %> <%= c.text_field :address2 %> <%= c.label :city %> <%= c.text_field :city %> <%= c.label :state_id%> <%= c.collection_select :state_id, State.order(:name), :id, :name %> <%= c.label :email %> <%= c.text_field :email %> <%= c.label :web %> <%= c.text_field :web %> <hr width="80%"> <%= c.label :industry_id %> <%= c.collection_select :industry_id, Industry.order(:name), :id, :name %> <br /> <%= c.fields_for :industry, @industry do |ci| %> <%= ci.label :keyword_id %> <%= ci.grouped_collection_select :keywords, Industry.order(:name), :keywords, :name, :id, :name, {:include_blank => true}, { :multiple => true } %> <% end %> <br /> <p><%= c.submit %></p> <% end %> ******************************************************** Here is the Conference Controller: ******************************************************** def edit @conference = Conference.find(params[:id]) end def update @conference = Conference.find(params[:id]) if @conference.update_attributes(params[:conference]) redirect_to action: "all", notice: ''conference was successfully updated.'' else render action: "edit" end end ******************************************************** Here are the parameters passed: {"utf8"=>"✓", "_method"=>"put", "authenticity_token"=>"k9fcAXF/iOXt3oVuTcxeDCaWOfE2PrVlBvFbQG8Mo/I=", "conference"=>{"name"=>"test conference", "address1"=>"address 1", "address2"=>"address 2", "city"=>"City", "state_id"=>"38", "email"=>"test-hcDgGtZH8xNBDgjK7y7TUQ@public.gmane.org", "web"=>"www.example.com", "industry_id"=>"1", "industry_attributes"=>{"keywords"=>["", "6", "5"], "id"=>"3"}}, "commit"=>"Update Conference", "action"=>"update", "controller"=>"conferences", "id"=>"1"} Thanks again for any help!! -- Posted via http://www.ruby-forum.com/. -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To unsubscribe from this group and stop receiving emails from it, send an email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To view this discussion on the web visit https://groups.google.com/d/msgid/rubyonrails-talk/366069381b09e06f7f5f657363660bc0%40ruby-forum.com. For more options, visit https://groups.google.com/groups/opt_out.