【问题标题】:rails nested object form and namespaced controllerrails 嵌套对象表单和命名空间控制器
【发布时间】:2010-01-16 03:18:40
【问题描述】:

我有一个这样的嵌套对象:

class Work < ActiveRecord::Base
  belongs_to :issue
  belongs_to :author
  has_many :pages, :class_name => 'Work'
  accepts_nested_attributes_for :pages, :allow_destroy => true
end

class Page < ActiveRecord::Base
  belongs_to :work
end

我有一个表单来创建/编辑作品,其中包含嵌套页面对象的字段。我按照this post 进行设置,所以我使用了一个助手,以便我的表单在您开始时创建一个新页面。

module AdminHelper

  def make_work(work)
    returning(work) do |w|
      w.pages.build if w.pages.empty?
    end
  end

end

那么,在我的表单中,我有:

- form_for make_work(@work) do |f|
  ...
  - f.fields_for :page do |page_f|
    = page_f.label :text
    %br
    = page_f.text_area :text

  %p
    = f.submit "Submit"

显示页面的字段,但是当它被提交时,它会在works控制器中查找创建操作。创建操作在管理工作控制器(命名空间)中,所以会中断。

我尝试使用命名空间对象,但如果我这样做它不知道页面:

- form_for make_work([:admin, @work]) do |f|
  ...

我如何使用嵌套对象形式的命名空间,以便它具有 pages 方法,但发布到命名空间的 admin/works 控制器?

【问题讨论】:

    标签: ruby-on-rails namespaces nested-forms


    【解决方案1】:

    我认为你应该有:

    fields_for :pages do |page_f|
                    ^
    

    如果表单的提交路径正确,还要检查生成的 html。在你的情况下,它应该是这样的:

    /admin/works/3
    

    编辑:

    fields_for 的示例:

    <% form_for @person do |person_f| %>
      <% person_f.fields_for :emails do |email_f| %>
         <%= email_f.text_field :address %>
      <% end %>
    <% end %>
    

    它适用于这样的关系:

    class Person
      has_many :emails
    end
    

    确保您没有遍历这样的页面:

    <% @work.pages.each do |page| %>
    ...
      <% fields_for :page do |p| %>
    ...
    

    【讨论】:

    • 是的,我有:pages,但它根本不会像那样呈现嵌套表单。当我使用复数时,我的“文本”对象得到了未定义的方法错误。除非我使用单数,否则它似乎没有得到这种关系?
    • 我使用相似的关系并且我总是使用复数形式。我从我的代码中添加了示例。
    【解决方案2】:

    这可能不是最好的解决方案,但你可以放弃你的 make_work 助手,使用 [:admin, @work] 定位表单(我永远记不起那个语法),然后在你的控制器中调用 w.pages.build,例如:

    控制器:

    @work = Work.new
    @page = @work.pages.build
    

    查看:

    -form_for [:admin, @work] ...
      -f.fields_for @page ...
    

    【讨论】:

    • 我现在正在我的控制器中尝试@work.pages.build,而忽略了助手。我在 admin/works_controller#create 中遇到未知属性错误。我很困惑。
    • ActiveRecord::UnknownAttributeError in Admin/worksController#create unknown attribute: page
    【解决方案3】:

    原来我的工作模式有问题。我有:

    class Work < ActiveRecord::Base
      belongs_to :issue
      belongs_to :author
      has_many :pages, :class_name => 'Work'
      accepts_nested_attributes_for :pages, :allow_destroy => true
    end
    

    'class_name => 'Work'' 导致它在 Work 类而不是 Page 类上查找 'text' 对象。现在可以了!

    【讨论】:

      猜你喜欢
      • 2017-01-18
      • 1970-01-01
      • 2011-09-19
      • 1970-01-01
      • 2014-05-19
      • 1970-01-01
      • 1970-01-01
      • 2012-07-08
      • 1970-01-01
      相关资源
      最近更新 更多