如何在Rails中使用多表继承为对象构建嵌套表单?我正在尝试使用一个具有has_many关系的模型与另一个具有多表继承功能的模型集建立嵌套表单来创建对象。我将formtasticcocoon用于嵌套形式,并使用act_as_relation gem来实现多表继承。

我有以下型号:

class Product < ActiveRecord::Base
 acts_as_superclass
 belongs_to :store
end

class Book < ActiveRecord::Base
     acts_as :product, :as => :producible
end

class Pen < ActiveRecord::Base
     acts_as :product, :as => :producible acts_as :product, :as => :producible
end

class Store < ActiveRecord::Base
    has_many :products
    accepts_nested_attributes_for :products, :allow_destroy => true, :reject_if => :all_blank
end'


对于此示例,书与其他产品相比唯一的唯一属性是作者字段。实际上,我在书中拥有许多独特的属性,这就是为什么我选择多表继承而不是更常见的单表继承的原因。

我正在尝试创建一个嵌套的表单,使您可以使用产品创建一个新商店。这是我的表格:

<%= semantic_form_for @store do |f| %>
  <%= f.inputs do %>
    <%= f.input :name %>

    <h3>Books/h3>
    <div id='books'>
    <%= f.semantic_fields_for :books do |book| %>
      <%= render 'book_fields', :f => book %>
    <% end %>
          <div class='links'>
      <%= link_to_add_association 'add book', f, :books %>
      </div>

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


而book_fields部分:

<div class='nested-fields'>
  <%= f.inputs do %>
    <%= f.input :author %>
    <%= link_to_remove_association "remove book", f %>
  <% end %>
</div>


我收到此错误:

undefined method `new_record?' for nil:NilClass


基于阅读act_as_relation的github页面上的问题,我想到了使商店和书籍之间的关系更加明确的想法:

class Product < ActiveRecord::Base
 acts_as_superclass
 belongs_to :store
 has_one :book
 accepts_nested_attributes_for :book, :allow_destroy => true, :reject_if => :all_blank
end

class Book < ActiveRecord::Base
     belongs_to :store
     acts_as :product, :as => :producible
end

class Store < ActiveRecord::Base
        has_many :products
        has_many :books, :through => :products
        accepts_nested_attributes_for :products, :allow_destroy => true, :reject_if => :all_blank
        accepts_nested_attributes_for :books, :allow_destroy => true, :reject_if => :all_blank
    end


现在,我得到一个无声的错误。我可以使用该表单创建新商店,而cocoon允许我添加新的书本字段,但是当我提交商店时,创建的是书本而不是子书。当我经过“ / books / new”路线时,可以毫无问题地创建一个跨越(产品和书本表)的新书本记录。

有解决此问题的方法吗?其余代码可在here中找到。

最佳答案

也许你可以:

根据您的stores_controller#new动作手动建立书籍关系
@store.books.build

手动存储与您有关的stores_controller#create操作
@store.books ... (对如何实现它不是很有信心)


保持联系。

07-24 12:30