1

NestedAttributesFormHelperの Rails api ドキュメントから作業し、stackoverflow を検索しています。

new.html.haml ビューに次のコードがあります。

=form_for listing, :html => {:id => :listing_form, :multipart => :true} do |f|
    =f.fields_for :main_picture, (listing.main_picture || listing.build_main_picture) do |fmp|
            =fmp.hidden_field :main, :value => 1
            =fmp.file_field :image, :class => :picture_select

そして、私のコントローラーの次のコード:

  def create
    @listing = Listing.new(params[:listing])

    @listing.save ? redirect_to(:root) : render('listings/new')
  end

ここに私のlisting.rbがあります:

class Listing < ActiveRecord::Base
  has_one :main_picture, :class_name => "Picture", :conditions => {:main => true}
  attr_accessible :main_picture_attributes
  accepts_nested_attributes_for :main_picture, :allow_destroy => true
end

そして私のpicture.rb:

class Picture < ActiveRecord::Base
  belongs_to :listing
  validates_presence_of :listing
  attr_accessible :listing, :main
end

また、フォームを送信しようとすると、次のエラー メッセージが表示されます。

main_picture.listing: can't be blank

フレームワークが main_picture (オブジェクト Picture) の Listing_id フィールドを親 Listing オブジェクトの id 値に自動的に設定しない理由がわかりません。

私が間違っていることはありますか?

4

1 に答える 1

3

が必要validates_presence_of :listingですか?子レコードが親オブジェクトの前に作成されていると思われるため、まだ ID がありません。

その行を削除してに追加:dependent => :destroyするhas_one :main_pictureと、孤立した画像レコードにならないようになります。

または、コントローラーを次のように書き換えます。

p = params[:listing]
@listing = Listing.new(p)
@picture = Picture.new(p.delete(:main_picture).merge({:listing => @listing})

etc.
于 2012-09-10T07:29:41.017 に答える