我试图通过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 %>
答案 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.id
。 genre
是该字符串,您在其上调用.id
,因此您的错误。
不可能告诉你要做什么,但你绝对不能在字符串上调用.id
并希望得到一些数据库记录的ID。