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 コントローラーで create アクションを探します。作成アクションは管理者の作業コントローラー (名前空間) にあるため、壊れます。

名前空間付きのオブジェクトで試してみましたが、このようにすると、ページについて認識しません:

- 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 %>

and it is for relationship like:

class Person
  has_many :emails
end

Make sure you didn't iterate over pages like this:

<% @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'' により、Page クラスではなく Work クラスで 'text' オブジェクトを検索していました。今それは動作します!

于 2010-01-17T16:08:54.157 に答える