views:

28

answers:

1

Today is the first day I'm looking into Ruby on Rails, and now I'm stuck. I have two scaffolds, artist and song.

In songs/new.html.erb, I have these lines:

...
<%= f.label :name %><br />
<%= f.text_field :name %>
...
<%= f.label :Artist %>
<%= collection_select(:song, :Artist, @artists, :id, :sort_name) %>
...

In the form for creating a new song, I want a <select> list with all artists. Using the code above works fine. The form is created as I want it, and the artists are listed. However, when submitting the new song, I get this error:

Artist(#69916999335860) expected, got String(#69917057438720)

The generated HTML code for the select looks like this:

<select id="song_Artist" name="song[Artist]">
  <option value="1">Vreeswijk, Cornelis</option>
  <option value="2">De lyckliga kompisarna</option>
  <option value="3">Wiehe, Mikael</option>
  <option value="4">Demian, Lars</option>
  <option value="5">Sundström, Stefan</option>
</select>

I guess the second last parameter for collection_select() is wrong, but what should it be?

+1  A: 

I think this should be:

<%= collection_select(:song, :artist_id, @artists, :id, :sort_name) %>

The second parameter is the method to be assigned in the model being created/updated. So in your controller the value would be retrieved from the params hash with params[:song][:artist_id]

A detailed explanation can be found in the Rails API docs under "collection_select"

zetetic
Thanks! What's your phone number? ;)
Johan