0

私のアプリでは:

A song has many setlists through allocations
A setlist has many songs through allocations
allocations belong to setlists and songs

次のフォームを使用して、既存のライブラリからセット リストに曲を追加しようとしています。

 <% @songs.each do |song| %>
            <tr>
               <%= nested_form_for(@setlist.allocations.build(song_id: song.id)) do |f| %>
               <td><%= song.title %></td>
               <td><%= song.artist %></td>
               <td><%= song.key %></td>
               <td>
                     <div><%= f.hidden_field :song_id %></div>
                  <%= f.submit "ADD", class: "btn btn-small btn-primary" %>
                  <% end %>

               </td>
            </tr>
          <% end %>

私のセットリストコントローラーには次のものがあります。

def edit
    @songs = Song.all(order: 'title')
    @setlist = Setlist.find(params[:id])
    @setSongs = @setlist.songs
    @allocations = Allocation.where("setlist_id =?", @setlist) 
  end

  def update
    @setlist = Setlist.find(params[:id])
    song = Song.find(params[:song_id])
    @setlist.allocate!(song)
    if @setlist.update_attributes(params[:setlist])
      # Handle a successful update.
      flash[:success] = "SAVED!"
      redirect_to setlists_path
    else
      render 'edit'
    end
  end

割り当て方法は、setlist モデルで次のように指定されます。

 def allocate!(song)
    allocations.create!(song_id: song.id)
  end

現時点では、クリックしてセットリストに曲を追加するたびに、次のように返されます。

SetlistsController#update の NoMethodError :song:Symbol の未定義のメソッド「id」

このバグは、テーブルの最初のレコードに対してのみ上記のエラーが発生するという点でも奇妙です。他のすべてのレコードは、レコードが追加されていない場合に「エラー」ページをレンダリングします。

任意のポインタをいただければ幸いです。よろしくお願いします

4

1 に答える 1

1

シンボル:songallocate!に渡しています

@setlist.allocate!(:song)

whenallocate!のインスタンスSongが渡されることを期待しています。:songシンボルにはメソッドがないため.id、エラーが発生します。

Song関連するものを渡そうとしている場合

<%= f.hidden_field :song_id %>

最初に を取得する必要がありますSong

song = Song.find(params[:allocation][:song_id])
@setlist.allocate!(song)
于 2012-07-10T17:16:39.493 に答える