1

В нашем приложении, у нас есть, среди прочего, эти три модели:рендеринга вложенных полей формы в Rails

class PackContent < ActiveRecord::Base 
    belongs_to :product 
    belongs_to :pack 

class Product < ActiveRecord::Base 
    has_many :pack_contents 
    has_many :packs, through: :pack_contents 

class Pack < ActiveRecord::Base 
    has_many :pack_contents 
    has_many :products, through: :pack_contents 
    accepts_nested_attributes_for :pack_contents 

Пакет имеет несколько pack_contents, которые в основном продукт и некоторые специфические productvariants. Таблица присоединиться (pack_contents) выглядит следующим образом:

pack_contents

Я сейчас пытаюсь отобразить эти pack_contents в работоспособной манере, но продолжаю работать в стену.

Я попытался:

.pack-product-rows 
    - @pack.pack_contents.each do |pc| 
    = f.simple_fields_for pc do |p| 
     = render :partial => 'pack_product_row', :locals => { :p => p, :pc => pc } 

Но тогда, по экономии, я получаю сообщение об ошибке сказав:

ActiveRecord::UnknownAttributeError in Admin::PacksController#update 
unknown attribute: pack_content 

И атрибуты имя поля формы являются неправильными, они не учитывают кратному поскольку они не содержат индекс.

Когда я пытаюсь это:

.pack-product-rows 
    - @pack.pack_contents.each do |pc| 
    = f.simple_fields_for :pack_contents do |p| 
     = render :partial => 'pack_product_row', :locals => { :p => p, :pc => pc } 

Это делает каждый частичный дважды, что, я полагаю, следует ожидать.

Если я не зацикливаюсь на содержимом и просто использую simple_fields_for, я получаю вывод, который я хочу, но не так, как я этого хочу. Я могу визуализировать поля с p.input_field :id и любит, но мне нужен доступ к pack_contents для того, чтобы показать мои данные, как это: (поля ввода предназначены быть скрыты)

enter image description here

Не уверен, как поступить.

+0

В вашем «пакете классов» вы набрали 'has_many: продукт через:: pack_contents'. Это должно быть 'has_many: продукты, через:: pack_contents'. Это была типичная ошибка? –

+0

Да, опечатка. Я получил ': products' в приложении. Починю. – cabaret

ответ

1

Я не уверен, понял ли я, что вы просите, но если вы просто хотите, чтобы доступ к текущему элементу автоматически повторялся через simple_fields_for, вы можете получить к нему доступ через построитель форм как p.object.

+0

Спасибо.Я этого не знал, и именно этого я и искал! – cabaret

1

Я предполагаю, что вы пытаетесь построить вложенную форму на views/packs/show.html.erb, где у вас есть переменная экземпляра @pack, инициализированная pack из базы данных. Таким образом, на этой странице у вас будет форма - simple_form_for @pack, внутри которой вы хотите вложить более pack_contents. Теперь метод simple_form_fields драгоценного камня simple_form работает так же, как метод fields_for в рельсах. Исходя из этого, я даю вам код ниже. Он должен работать правильно, но вы можете сделать несколько синтаксических изменений, чтобы заставить его работать.

- simple_form_for @pack do |pack_form| 
    .pack-product-rows 
    - @pack.pack_contents.each do |pack_content| 
     = f.simple_fields_for :pack_contents, pack_content do |pack_content_fields| 
     = render :partial => 'pack_product_row', :locals => { :pack => @pack, :pack_content => pack_content, :pack_content_fields => pack_content_fields} 

Теперь в частичной pack_product_row вам нужно будет использовать три местных жителей прошли. Вы должны уже использовать pack и pack_content, но все поля для pack_contents, которые вы хотите отобразить, должны быть записаны как pack_content_fields.field_name. Если ваше соглашение об именах верно для всех полей, то эти поля будут либо пустыми, если pack_content пуст или имеет значение, хранящееся в базе данных.

Смежные вопросы