0

У меня проблема с получением кода ниже, чтобы работать.fields_for for has_many через отношения rails 3

class Page < ActiveRecord::Base 
    has_many :page_parts, :through => :page_parts_pages 
    has_many :page_parts_pages 
    accepts_nested_attributes_for :page_parts, :allow_destroy => true 
    accepts_nested_attributes_for :page_parts_pages, :allow_destroy => true 
    end 

    class PagePart < ActiveRecord::Base 
    has_many :page_parts_pages 
    has_many :pages, :through => :page_parts_pages 
    end 

    class PagePartsPage < ActiveRecord::Base 
    belongs_to :page 
    belongs_to :page_part 
    end 

Структура таблицы: -

pages 
     id, title 

    pages_parts 
     id, title 

    page_parts_pages 
     id, page_id, page_part_id 

Посмотреть код

<% page_fragment.each do |k,v| %> 

    <% if v.nil? or v.blank? or v.empty? %> 

     <% parts = f.object.page_parts.build if f.object.page_parts.blank? %> 

     <%= f.fields_for :page_parts, parts do |p| %> 

     <%= render 'page_part_form_field', :f => p %> 

     <% end %> 

     <% else %> 

     <% parts_page = f.object.page_parts_pages.build if f.object.page_parts_pages.blank? %> 

    <%= f.fields_for :page_parts_pages, parts_page do |p| %> 

     <%= render 'page_part_page_form_field', :f => p %> 

    <% end %> 

    <% end %> 

<% end %> 

На самом деле сценарий, я должен отобразить поля для page_parts и page_parts_pages на состояние основе. Если условие выполнено, поля отображения для page_parts еще отображают поля для page_parts_pages.

Он работает отлично для нового действия, но для действия редактирования он отображается неправильно.

Любая помощь очень ценится.

Заранее спасибо

ответ

0

Вы создаете новые page_parts в таком виде:

parts = f.object.page_parts.build if f.object.page_parts.blank? 
parts_page = f.object.page_parts_pages.build if f.object.page_parts_pages.blank? 

«сборки» создает новые объекты (не будет сохраняться их в базе данных, хотя). Поэтому неудивительно, что он работает для новых, но не для редактирования. Вы можете попробовать это:

<% page_fragment.each do |k,v| %> 
    <% if v.blank? %> 
     <%= f.fields_for :page_parts do |p| %> 
     <%= render 'page_part_form_field', :f => p %> 
     <% end %> 
     <% else %> 
    <%= f.fields_for :page_parts_pages do |p| %> 
     <%= render 'page_part_page_form_field', :f => p %> 
    <% end %> 
    <% end %> 
<% end %> 

rails api имеет довольно хорошую документацию forms_for и других форм хелперов.

+0

Спасибо @salil за ваше время, но с помощью вашего решения возникли две проблемы: - 1) Форма отправила только один экземпляр page_parts_pages, тогда как она должна быть двух. 2) Возникла ошибка Невозможно назначить защищенные атрибуты: page_parts_page, page_part. После преодоления этой ошибки приложение подняло «неизвестный атрибут page_parts_page» – vikram

+0

Отредактировал мой ответ. Я думаю, если вы знаете, что делает field_for, вы найдете правильный способ реализовать свою форму. – Salil

+0

Я попробую отредактированный ответ. И также, это будет здорово для меня, если вы поделитесь некоторыми ссылками, где я могу понять fields_for лучше – vikram

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