Johan
Johan

Reputation: 5053

Ruby on Rails: Submitting a form referring to another controller via collection_select

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?

Upvotes: 0

Views: 232

Answers (1)

zetetic
zetetic

Reputation: 47548

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"

Upvotes: 1

Related Questions