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 を選択してコレクションにあるものを使用します
どんな助けでも大歓迎です。
前もって感謝します