I get the error ActiveRecord::AssociationTypeMismatch
(Course(#23456280859460 ) expected, got String(#23757015656420 ))
when i submit an update with the code below. Any ideas on what is
going on?
## /views/enrollment/edit.html.erb
<% form_for(@enrollment ) do |f| %>
<%= f.collection_select :course, @courses , :id, :name %>
<%= f.submit "Update" %>
<% end %>
## /controllers/enrollment_controller.rb
def edit
@enrollment = Enrollment.find(params[:id])
@courses = Course.find(:all)
end
def update
@enrollment = Enrollment.find(params[:id])
respond_to do |format|
if @enrollment.update_attributes (params[:enrollment])
flash[:notice] = 'Enrollment was successfully updated.'
format.html { redirect_to(@enrollment ) }
format.xml { head :ok }
else
format.html { render :action => "edit" }
format.xml { render :xml => @enrollment.errors , :status
=> :unprocessable_entity }
end
end
end
11175
(-- --)
June 2, 2008, 10:06pm
2
Melvin,
You need to reference the method, not the object in your collection
select.
So instead of using ":course":
<pre><%= f.collection_select :course, @courses , :id, :name %></pre>
It should be ":course_id":
<pre><%= f.collection_select :course_id, @courses , :id, :name %></pre>
Try that and see if it works.
-- Josh N. Abbott
Melvin Ram wrote:
I've tried that as well... and it actually does update the enrollment
record... but instead of adding the id of the course, it inserts the
course itself i.e #<Course:0x2aaaae913bf0>
11175
(-- --)
June 2, 2008, 10:29pm
4
That's odd. Are you declaring your associations in the models? Also what
version of Rails are you using?
-- Josh
Melvin Ram wrote:
rails -v => 2.1
class Enrollment < ActiveRecord::Base
belongs_to :course
belongs_to :user
end
class Course < ActiveRecord::Base
has_many :lessons
belongs_to :user
has_many :enrollments
end
Thanks Josh for all your help!
The column was created using migrations with the following code:
create_table :enrollments do |t|
t.references :course
# other columns
end
Right now I'm creating a new bare-bones app to see if I can simplify
the code... I'll let you know if I can get it working in there.
11175
(-- --)
June 2, 2008, 11:30pm
7
Hmm... so even that's right. Definitely let me where you end up with a
bare-bones app. I've never heard of this happening, so I'll be very
curious in case I or someone I know happens to run into someday.
-- Josh
Melvin Ram wrote:
It works just fine in my bare bones app with the code below. Gotta
comment out parts of my app to see what is messing things up.
# erratas_controller.rb
def edit
@errata = Errata.find(params[:id])
@books = Book.find(:all)
end
# model/book.rb
class Book < ActiveRecord::Base
has_many :erratas
end
# models/errata.rb
class Errata < ActiveRecord::Base
belongs_to :book
end
# views/errata/edit.html.erb
<% form_for(@errata ) do |f| %>
<p>
<b>Book</b><br />
<%= f.collection_select :book_id, @books , :id, :name %>
</p>
<p>
<%= f.submit "Update" %>
</p>
<% end %>
# views/errata/show.html.erb
Book ID: <%=h @errata.book_id %>
I was doing a stupid error.
In my show.html.erb where it was outputting #<Course:0x2aaaae913bf0>,
I was rendering @enrollment.course instead of @enrollment.course_id .
So it was rendering the course object.
Dumb huh?
11175
(-- --)
June 3, 2008, 12:03am
10
Ha. I've done that before
I guess the red flag should've definitely been when you said you were
saving #<Course:0x2aaaae913bf0> into an integer column. MySQL wouldn't
have let that happen because that's clearly not an integer.
Glad you got it sorted out!
-- Josh
Melvin Ram wrote: