更新has_many:通过与rails表单关联

时间:2015-03-13 02:41:21

标签: ruby-on-rails activerecord

我试图通过song_genre_relationships模型更新具有多个流派的歌曲模型的表单。我更喜欢通过表单字段中的数组更新任何给定歌曲的类型ID。

我怀疑我的控制器已经关闭了,但我对Rails还不熟悉并且不确定。

以下是我的模型,表格和控制器。

根据meagar的回应编辑。

song.rb

class Song < ActiveRecord::Base

    has_many :song_genre_relationships
    has_many :genres, :through => :song_genre_relationships

end

song_genre_relationships.rb

class SongGenreRelationship < ActiveRecord::Base

    belongs_to :song
    belongs_to :genre

end

genre.rb

class Genre < ActiveRecord::Base

    has_many :song_genre_relationships
    has_many :songs, :through => :song_genre_relationships

end

song_controller.rb

class SongController < ApplicationController

    def update
    @song = Song.find(params[:id])

    relationships = @song.song_genre_relationships
    @genres = Genre.all
    @genres.each do |genre|
        unless relationships.detect { |g| g.genre_id == genre.id }
            relationships.build genre_id: genre.id
        end
    end

    if @song.update_attributes(song_params)

        flash[:notice] = "Song updated successfully."

        redirect_to(:action => 'index')
    else
        render('edit')
    end
end

private
def song_params
    params.require(:song).permit(:name, :genre_ids => [])
end

_form.html.erb(歌曲形式)

<%= form_for(@song) do |f| %>

    <%= f.label :name, 'Title' %>
    <%= f.text_field :name %>

    <%= f.label :genre_ids, 'Genres' %>
    <%= f.text_area :genre_ids %>


<%= f.submit %>
<% end %>

1 个答案:

答案 0 :(得分:0)

这是错误的:

  @genres = params[:song][:genre_ids]
    Array(@genres).each do |genre|
        unless relationships.detect { |g| g.genre_id == genre.id }
            relationships.build genre_id: genre
        end
    end

params[:song][:genre_ids]是一个字符串。在您的示例中,它包含"[<whatever id's input to the form>]"

您将其包装在Array(@genres)的数组中。现在,您有一个包含单个项目的数组,即字符串。然后迭代该单个项目,将其放入循环内的genre

然后你测试g.genre_id == genre.idgenre是该字符串,您在其上调用.id,因此您的错误。

不可能告诉你要做什么,但你绝对不能在字符串上调用.id并希望得到一些数据库记录的ID。