0

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

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

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

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 控制器?

4

3 回答 3

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| %>
...
于 2010-01-16T10:08:01.423 回答
0

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

控制器:

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

看法:

-form_for [:admin, @work] ...
  -f.fields_for @page ...
于 2010-01-16T03:30:58.453 回答
0

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

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' 对象。现在它起作用了!

于 2010-01-17T16:08:54.157 回答