我正在尝试创建一个嵌套属性表单来创建一个模型,该模型主要是其他两个模型之间的关联“连接器”。在我的例子中,模型代表books
,awards
和“连接器”模型book_awards
。当我编辑一本书时,我希望能够快速选择它获得了哪些奖项。
我一直在使用 http://railscasts.com/episodes/196-nested-model-form-part-1 来帮助我入门,但恐怕我几乎被卡住了。
另一个看起来相似的 SO 问题是 accept_nested_attributes_for 和 find_or_create?不幸的是,这也不是我正在做的事情,我无法适应它。
我的模型看起来像这样。每个模型都有额外的属性和验证等,但为了清楚起见,我已经删除了它们。
class Book < ActiveRecord::Base
has_many :book_awards
accepts_nested_attributes_for :book_awards, :allow_destroy => true
end
class Award < ActiveRecord::Base
has_many :book_awards
end
class BookAward < ActiveRecord::Base
belongs_to :book, :award
end
在我的书中用于编辑和新建的控制器方法,以及用于创建和更新的失败案例中,我有一行@awards = Award.all
.
在我看来,我希望看到所有奖项的列表,旁边有复选框。当我提交时,我想更新、创建或销毁模型book_award
。如果选中该复选框,我想更新现有模型或创建一个新模型(如果它不存在)。如果未选中该复选框,那么我想销毁现有模型,或者如果奖励从不存在,则什么也不做。我对book_awards
. 我不确定复选框选择器是否应该在这个部分中。
我认为我的复选框将成为我的钩子,:_destroy
但它的极性颠倒了。我认为这样的事情基本上可以做到:
= f.check_box :_destroy, {}, 0, 1
目前,我有这个,但我不确定它真正属于哪里。
接下来是我目前不起作用的观点,但也许它会帮助展示我正在尝试做的事情。我循环遍历awards
并使用 afields_for
为已经存在的任何内容设置嵌套属性。它非常丑陋,但我认为它有点工作。但是,我真的不知道如何开始使用 else 案例。
= f.label :awards
- @awards.each do |a|
- if f.object.awards && f.object.awards.include?(a)
= f.fields_for :book_awards, f.object.book_award.select{|bas| bas.award == a } do |ba|
= render 'book_awards', :f => ba, :a => a
- else
= fields_for :book_awards do |ba|
= render 'book_awards', :f => ba, :a => a
我希望每次都以相同的顺序列出奖项(我@awards
在控制器中的分配可能会指定顺序),而不是首先或最后列出现有的奖项。