5

ネストされたフォーム データの処理に関するアドバイスを求めています。洞察に感謝します。

問題は、モデルで次のコードが必要な理由が 100% わからないことです。

  accepts_nested_attributes_for :holiday_image, allow_destroy: true, :reject_if => lambda { |a| a[:title].blank? }

私がaccepts_nested_attributes_forアソシエーションに触れる必要がある理由がわかりません:

:reject_if => lambda { |a| a[:title].blank? }

この :reject_if ラムダを削除すると、空の休日の写真オブジェクトがデータベースに保存されます。フォームから :title フィールドを空の文字列として取得するためだと思いますか?

私の質問は、HolidayImage モデルを拡張して説明やメモなどの文字列をさらに含めたい場合、これを正しく行っているか、ネストされたフォーム内でより良い方法があるかということだと思います。

もっと簡潔に言えなかったらごめんなさい。

私のシンプルな休日アプリ。

# holiday.rb 
class Holiday < ActiveRecord::Base
  has_many :holiday_image
  accepts_nested_attributes_for :holiday_image, allow_destroy: true, :reject_if => lambda { |a| a[:title].blank? }

  attr_accessible :name, :content, :holiday_image_attributes

end

画像のアップロードには CarrierWave を使用しています。

# holiday_image.rb 
class HolidayImage < ActiveRecord::Base
  belongs_to :holiday
  attr_accessible :holiday_id, :image, :title

  mount_uploader :image, ImageUploader
end

私の _form パーシャル内には、field_for ブロックがあります

<h3>Photo gallery</h3>
<%= f.fields_for :holiday_image do |holiday_image| %>
<% if holiday_image.object.new_record? %>

  <%= holiday_image.label :title, "Image Title" %>
  <%= holiday_image.text_field :title %>
  <%= holiday_image.file_field :image %>

<% else %>

  Title: <%= holiday_image.object.title %>
  <%= image_tag(holiday_image.object.image.url(:thumb)) %>
  Tick to delete: <%= holiday_image.check_box :_destroy %>

<% end %>

ご辛抱いただきありがとうございました。

4

1 に答える 1

1

accepts_nested_attributes_for通常、一括割り当て中に子を構築するために使用されます (新しいレコードを作成するとき、関連するモデルを構築するとき)。たとえば、Userwhichのようなモデルがある場合、 の作成中にhas_many UserPhotos複数のモデルを取得し、それらすべてを作成時に構築できます。UserPhotosUserUser

ImageUploader単一のモデル ( ) に単一のイメージ ( ) をマウントしているだけなので、ネストされた属性を処理する必要はないと思いますHolidayImage。これにより、CarrierWave が のインスタンスをマウントするために使用するHolidayImage単一のフィールドがモデルに与えられます。:imageImageUploader

これを処理する方法はいくつかありますが、知っておくべき基本的な情報を次に示します。

  1. validates_presence_of :imageが存在することを確認するために使用できます:image。これが機能するのは、マウントされたアップローダが検証 API で使用されるメソッドを実装しているためです( ActiveRecord によるアップロードの検証present?に関する Carrier Wave Wiki を参照してください)。この方法では、タイトルが設定されているかどうかをテストする必要はありませんが、代わりに、モデルの作成を許可する前に画像がアップロードされたかどうかをテストできます。もちろん、必要に応じて失敗した検証を処理する必要があります。

  2. before_save画像が存在するか、アップロードされたばかりかを CarrierWave に問い合わせることができる、好きなことを行う を追加できます。あなたの場合、モデルでこれをテストするためにimage.present?と をそれぞれ呼び出すことができます。例については、この CarrierWave How To を参照してください。image_changed?HolidayImage

  3. ネストされた形式で複数の画像を受け入れたい場合は、この CarrierWave How To on usingを参照してくださいaccept_nested_attributes_for

于 2013-01-21T04:49:47.040 に答える