我正在为这些页面的内容创建一个带有Page模型和Blocks系统的自定义CMS。数据模型的简化视图是:
Page
has_many :blocks
has_many :text_blocks, through: :blocks, source: :blockable, source_type: "TextBlock", dependent: :destroy
has_many :image_blocks, through: :blocks, source: :blockable, source_type: "ImageBlock", dependent: :destroy
Block
belongs_to :page
belongs_to :blockable, polymorphic: true
accepts_nested_attributes_for :blockable
TextBlock
has_one :block, as: :blockable
ImageBlock
belongs_to :image
has_one :block, as: :blockable
在控制器中,我使用基于param的适当类型的可阻塞来设置@block。我正在尝试创建一个结构与此类似的表单:
=form_for @block do |f|
<<<Block Attributes Here>>>
=f.fields_for :blockable do |bf|
= render bf.object.class_name.downcase.underscore + "_fields"
这会正确呈现表单,但是当我保存块时,它只设置blockable_type字段,并且不保存可阻塞或设置blockable_id。我发现让它工作的唯一方法是在create动作中手动创建blockable。这似乎不应该是必要的。我的应用程序也有类似的导航列表结构,所以我真的想找出为什么这没有工作没有感觉像“hackish”代码。任何想法将不胜感激!
答案 0 :(得分:0)
这可能不起作用,但您是否尝试直接输出字段:
=f.fields_for :blockable do |bf|
= f.text_field :blockable
我查看了其他SO答案,看起来它是多态的--Rails应该为你做的工作