我有一个这样的嵌套对象:
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"
显示页面的字段,但是当它提交时,它会在工作控制器中查找创建操作。 create action位于admin works控制器(namespaced)中,以便中断。
我尝试使用命名空间对象,但如果我这样做,它不知道页面:
- form_for make_work([:admin, @work]) do |f|
...
如何将命名空间与嵌套对象表单一起使用,以便它具有pages方法,但是发布到命名空间的admin / works控制器?
答案 0 :(得分: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| %>
...
答案 1 :(得分:0)
这可能不是最佳解决方案,但您可以放弃make_work
帮助程序,使用[:admin, @work]
定位表单(我永远不会记住该语法)并执行w.pages.build
在你的控制器中打电话,例如:
控制器:
@work = Work.new
@page = @work.pages.build
视图:
-form_for [:admin, @work] ...
-f.fields_for @page ...
答案 2 :(得分: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 =&gt; 'Work''导致它在Work类中查找'text'对象,而不是Page类。现在它有效!