2

ImageComponent (アセット自体に追加の属性を持つ一種のラッパー) と ImageAsset (単にアセット) の 2 つのオブジェクトを使用してネストされたフォームがあり、関係は次のとおりです。

ImageAsset has_many, :image_components

画像コンポーネントの所属先:image_asset

フォーム上で Ryan Bates の nested_form gem を使用して ImageAsset を作成しています。

ImageComponentフォームからネストされた属性を使用して、ImageAssetを作成するか、既存のImageAssetを関連付けたいときに問題が発生します。

私は現在、これを私のフォームで次のように設定しています

<legend>Image Component</legend>

<%= f.fields_for :component do |component_fields| %>
   <p>Select an existing image ...</p>
   <%= component_fields.label 'image_asset_id', 'Image' %>
   <%= component_fields.select "image_asset_id", options_for_image_select(component_fields.object.image_asset_id) %>

   <p>... or upload a new one!</p>
   <%= component_fields.fields_for :new_image_asset, ImageAsset.new do |asset_fields| %>
          <%= asset_fields.label :title %>
          <%= asset_fields.text_field :title %>

          <%= asset_fields.label :image %>
          <%= asset_fields.file_field :image  %>
   <% end %>

   <%= component_fields.label :caption %>
   <%= component_fields.text_field :caption %>
<% end %>

<%= f.hidden_field :component_type %>
<%= f.link_to_remove 'Remove Component' %>

ここでの問題は、2 つの画像を投稿していることです。1 つは既存の画像 (新規アクションか作成アクションかによって、nil になる可能性があります) であり、2 つ目は新しくアップロードされた画像属性です。

私の最初の考えは、モデルに before_validation コールバックを作成することでした (new_image_asset はモデルの attr_accessor であり、フォームから属性を渡すことができます)。

if new_image_asset[:title].present? || new_image_asset[:image].present?
    image_asset = ImageAsset.new(new_image_asset)
end

ただし、これにより、画像がおそらく空白であるという問題が引き続き発生します(アセットがまだ保存されていないためだと思います)

画像のフォームに検証エラーを保持しながら、これを行う別の方法はありますか?

ここでの希望は、ユーザーが新しい画像アセットに何かを含めた場合、それを作成して検証しようとすることでした。new_image 属性に何もない場合は、既存の ImageAsset を選択してコレクションにあるものを使用します

どんな助けでも大歓迎です。

前もって感謝します

4

0 に答える 0