Forum: Ruby on Rails grouped_collection_select for has_many :through Association not Updating

90db0161cbe4834e88dc221bc64bf9aa?d=identicon&s=25 Jim Miller (jemiller1963)
on 2013-11-07 22:40
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@example.com", "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!!
Please log in before posting. Registration is free and takes only a minute.
Existing account

NEW: Do you have a Google/GoogleMail, Yahoo or Facebook account? No registration required!
Log in with Google account | Log in with Yahoo account | Log in with Facebook account
No account? Register here.