嵌套的对象形式

时间:2010-10-23 18:25:20

标签: ruby-on-rails nested-forms

我是一个铁杆和红宝石的诺布,我很确定这个完全愚蠢的东西我不知道..

尝试构建嵌套表单,并在网上找到了很多示例,并尝试并无法重现所需的结果。

“卖家”字段甚至没有显示,当我提交表格时 我明白了:

  

未知属性:item

模型:

class Dealerform < ActiveRecord::Base
 belongs_to :dealer
 has_one :seller :class_name => 'Seller'
 has_many :items, :through => :seller
 accepts_nested_attributes_for :seller, :items

end

class Seller < ActiveRecord::Base
 belongs_to :dealerform
 has_many :items :class_name => 'Item'
end

class Item < ActiveRecord::Base
 belongs_to :seller
end

视图:

<% form_for(@dealerform) do |f| %>
<%= f.error_messages %>
 <p>
 <%= f.label :date %><br />
 <%= f.datetime_select :date %>
 </p>
      #...more fields ...

<% f.fields_for :seller do |seller| %>

<p>
 <%= seller.label :fname %><br />
 <%= seller.text_field :fname %>
</p>
      #...more fields ...

<% end %>

 <% f.fields_for :item do |item| %>
  <p>
   <%= item.label :foo %><br />
   <%= item.text_field :foo %>
  </p>
      #...more fields ...

 <% end %>

<%= f.submit 'Create' %> 
<% end %>

基于建议.. 改变了以下几行:

<% f.fields_for :seller do |seller| %>
<% f.fields_for :item do |item| %>

为:

<% f.fields_for @seller do |seller| %>
<% f.fields_for @item do |item| %>

现在它们出现在表单中,并在尝试提交表单时 我明白了:

  

未知属性:nil_class

当我改变时:

def new
  @dealerform = Dealerform.new

为:

def new
  @dealerform = Dealerform.new
  @dealerform.seller.build

我明白了:

  

nil的未定义方法`build':NilClass

3 个答案:

答案 0 :(得分:2)

这是因为fields_for属性只显示存在的资源。在您的控制器中,您需要为表单构建容器对象。所以在您的控制器中

def new
    #2.times {@dealer_form.items}
    @dealer_form = DealerForm.new
    @dealer_form.seller = Seller.new
    #or @dealer_form.seller.build
end 

答案 1 :(得分:0)

看起来你的dealerform模型has_many项目,但你的fields_for正在提交一个单项,所以当它试图在创建动作中初始化你的经销商时,它试图分配dealerform.item但是没有这样的方法。如果经销商有很多项目,您可以查看此示例http://media.pragprog.com/titles/fr_arr/multiple_models_one_form.pdf,了解如何在单一表单中管理has_many。

答案 2 :(得分:0)

正如Sam所说,你需要有一个实际的对象,无论是新的还是现有的:

f.fields_for @seller

您可以通过几种不同的方式获取@seller,使用build创建一个新的,或者如果您正在编辑现有记录,请使用@dealerform.seller

对于项目,您可能需要循环显示多个项目,具体取决于您要显示的表单数量。查看http://www.railscasts.com上的一些截屏视频。