以嵌套形式查看相关值

时间:2015-02-22 18:28:20

标签: ruby-on-rails-3.2

在嵌套表单中,目标是显示相关表记录的值。但以下失败

   <%= f.fields_for :product_units do |g| %>
      <%= g.label :product_unit, unit.name %>

as undefined local variable or method 'unit'正确的语法是什么?

1 个答案:

答案 0 :(得分:0)

要使用嵌套的fields_for(f.fields_for),必须正确设置模型对象,这里没有显示。

例如:如果关系是@product和许多@product_units:

product.rb:

class Product < ActiveRecord::Base
  has_many :product_units, dependent: :destroy
  has_many :units, through: :product_units
  accepts_nested_attributes_for :units #if you want to update it
end

product_unit.rb:

class ProductUnit < ActiveRecord::Base
  belongs_to :product
  belongs_to :unit
end

unit.rb:

class Unit < ActiveRecord::Base
  has_many :products, through: :product_units
  has_many :product_units, dependent: :destroy
end

然后您的嵌套表单可能如下所示(如果它是has_one使用单数f.field_for

<%= form_for @product do |f| %>
  <%= f.fields_for :product_units do |g| %>
    <%= g.fields_for :units do |u| %>
      <%= u.label :name, "Product Unit Name:" %>
      <%= u.text_field :name %> #if you want a text_field to edit it
    <% end %>
  <% end %>
<% end %>

此外,如果此表单中不存在单元,您可能需要先在控制器中添加逻辑,然后再在此处显示它。

或者,如果每个关联都已存在@product.unit,则只需在视图中调用该关联,如果您需要显示单位标签而不是它可编辑。

一般评论:

当您发布错误时,请发布错误消息的课程详细信息,因为undefined method 'unit' for #<ActionView::Helpers::FormBuilder> 实际上非常不同来自undefined method 'unit' for nil:NilClass 这个消息的后半部分通常在调试时更重要,因为它会告诉您有关该对象的信息与...合作。