Чтобы использовать вложенные поля_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
Тогда ваше n Заинтересованное форма может выглядеть следующим образом (если это 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
Эта последняя часть сообщение обычно более важно при отладке, поскольку оно сообщает вам информацию об объекте, с которым вы работаете.
Да, это ошибка formBuilder 'для #' Модель была определена 'has_many: product_units, depend:: destroy has_many: units, через:: product_units' , ProductUnit также 'принадлежит_to: product принадлежит_to: unit' Настройка работает, так как я могу изменить значения в базе данных. Только ошибка метки с ошибкой formBuilder; соответствующее значение 'unit.name' предназначено только для отображения ... –
Jerome
Я обновил свой ответ для вас. В вашем исходном вопросе нет никаких указаний на то, что '' 'unit''' определен так естественным'''unit.name''' не будет работать. В зависимости от исходной переменной экземпляра вы можете просто вызвать '' '@product.unit.name, если только @ product.unit.blank? '' ', Если вы просто хотите показать ассоциацию, если она существует. – Kelseydh