рельсы вложенного объекта формы и пространства имен контроллера - PullRequest
0 голосов
/ 16 января 2010

у меня есть такой вложенный объект:

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"

, которая отображает поля для страницы, но когда она отправлена, она ищет действие create в контроллере works. действие create находится в контроллере работ администратора (namespaced), поэтому оно прерывается.

Я пытаюсь сделать это с объектом пространства имен, но если я делаю это таким образом, он не знает о страницах:

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

как использовать пространство имен с формой вложенного объекта, чтобы оно имело метод страниц, но отправляло сообщения на контроллер пространства / имен администратора / works?

Ответы [ 3 ]

1 голос
/ 16 января 2010

Я думаю, вы должны иметь:

fields_for :pages do |page_f|
                ^

Также проверьте в сгенерированном html, правильно ли указан путь отправки формы В вашем случае это должно быть что-то вроде:

/admin/works/3

EDIT:

Пример для 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| %>
...
0 голосов
/ 17 января 2010

Оказывается, у меня что-то не так в моей рабочей модели. у меня было:

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 '' заставляло его искать объект 'text' в классе Work, а не в классе Page. теперь это работает!

0 голосов
/ 16 января 2010

Возможно, это не лучшее решение, но вы можете просто оставить свой помощник make_work, нацелить форму с помощью [:admin, @work] (я никогда не могу вспомнить этот синтаксис) и просто выполнить вызов w.pages.build в вашем контроллере, например :

Контроллер:

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

вид:

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