【问题标题】:fields_for for has_many through relationship rails 3fields_for 为 has_many 通过关系 rails 3
【发布时间】:2012-06-28 06:09:12
【问题描述】:

我无法让下面的代码工作。

  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 的字段。

对于新操作它工作得非常好,但对于编辑操作它显示不正确。

非常感谢任何帮助。

提前致谢

【问题讨论】:

    标签: ruby-on-rails-3 nested-forms has-many has-many-through fields-for


    【解决方案1】:

    您正在以这种形式创建新的 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?
    

    'build' 创建新对象(但它不会将它们保存在数据库中)。所以,难怪它适用于新的,但不适用于编辑。 你可以试试这个:

      <% 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 和其他表单助手的非常好的文档。

    【讨论】:

    • 感谢@salil 抽出宝贵时间,但使用您的解决方案引发了两个问题:- 1) 该表单仅发布了一个 page_parts_pages 实例,而应该是两个。 2) 引发错误无法批量分配受保护的属性:page_parts_page、page_part。克服此错误后,应用程序引发“未知属性 page_parts_page”
    • 编辑了我的答案。我想如果你知道 fields_for 的作用,你就会找到实现表单的正确方法。
    • 我会尝试编辑后的答案。而且,如果你分享一些我可以更好地理解字段的链接,那对我来说会很棒
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多