0

我有问题获得下面的代码工作。fields_for has_many通过关系导轨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

编辑我的答案。我想如果你知道fields_for是什么,你会找到正确的方式来实现你的表单。 – Salil

+0

我会尝试编辑的答案。而且,如果你分享一些链接,我可以更好地理解这些领域,那对我来说将会非常棒 – vikram