使用现有数据更新Rails嵌套模型表单

时间:2012-07-10 17:10:47

标签: ruby-on-rails ruby-on-rails-3

在我的应用中:

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 %>

在我的setlists控制器中,我有:

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

allocate方法在setlist模型中指定为:

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

每当我点击将歌曲添加到设置列表时,它会返回以下内容。

SetlistsController#update中的NoMethodError undefined方法`id':song:Symbol

该错误也很奇怪,因为它只对表中的第一条记录执行上述错误,而其他所有错误都会在未添加记录时呈现“错误”页面。

任何指针都将不胜感激。非常感谢提前

1 个答案:

答案 0 :(得分:1)

您正在将符号:song传递给

中的allocate!
@setlist.allocate!(:song)

allocate!期望传递Song的实例时。 :song符号没有方法.id,因此错误。

如果您尝试传递与

相关的Song
<%= f.hidden_field :song_id %>

您必须先获得Song

song = Song.find(params[:allocation][:song_id])
@setlist.allocate!(song)