我是一个铁杆和红宝石的诺布,我很确定这个完全愚蠢的东西我不知道..
尝试构建嵌套表单,并在网上找到了很多示例,并尝试并无法重现所需的结果。
“卖家”字段甚至没有显示,当我提交表格时 我明白了:
未知属性: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
答案 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上的一些截屏视频。