【问题标题】:Saving collection_select with has_many through using Rails通过使用 Rails 保存 collection_select 和 has_many
【发布时间】:2012-03-18 18:29:29
【问题描述】:

我通过与我的模型关联设置了一个 has_many,并且我正在尝试创建一个表单,我可以在其中向提交的歌曲添加多种流派。我为此使用了 collection_select 助手。以下是关于我的代码是如何设置的 sn-ps。

歌曲模型

has_many :song_genres
has_many :genres, :through => :song_genres

类型模型

has_many :song_genres
has_many :songs, :through => :song_genres

歌曲类型模型

belongs_to :song
belongs_to :genre

然后在我的 new.html.erb 我有这个

collection_select :song, :genres, Genre.all, :id, :name, {:selected => 1}, {:multiple => true}

当我提交表单时,我得到一个

Can't mass-assign protected attributes: genres

错误

我知道我在这里遗漏了一些重要的东西。有人可以帮助我了解如何正确设置吗?

谢谢!

【问题讨论】:

  • 完整的解决方案在 cmets 中。

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


【解决方案1】:

试试这个方法:

collection_select :song, :genre_id, Genre.all, :id, :name, {:selected => 1}, {:multiple => true}

如Rails guide 中所述: “如果您使用 select(或类似的帮助器,例如 collection_select、select_tag)来设置 belongs_to 关联,您必须传递外键的名称(在上面的示例中为 city_id),而不是关联本身的名称。”

【讨论】:

  • 当我尝试得到undefined method 'genre_id' for #<Song:0x501efe8> 时,我还需要控制器上的什么来保存这些选项?目前我只有@song.save,就是这样。
  • 我又在读你的问题,你怎么能用一个选择来选择多个流派?
  • 设置:multiple => true 让我选择多个选项
  • 我明白,我不知道collection_select 在这些情况下是如何工作的。在这种情况下,您可能需要使用其他帮助程序 [1],然后在控制器中使用这些值手动创建 SongGenre 对象。 [1]:guides.rubyonrails.org/…
  • 所以我让它工作了。我必须使用这个 <%= collection_select :song, :genre_ids, Genre.all, :id, :name, {:selected => 1}, {:multiple => true} %> 并将 attr_accessible :genre_ids 添加到我的 Song 模型中。谢谢帮助
猜你喜欢
  • 2020-05-01
  • 2014-09-01
  • 2015-11-27
  • 2015-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-24
  • 1970-01-01
相关资源
最近更新 更多