2

我有一个使用 2 个对象的嵌套表单,ImageComponent(一种在资产本身周围具有额外属性的包装器)和 ImageAsset(只是资产),关系如下

ImageAsset has_many, :image_components

ImageComponent 属于_to :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 张图片。一个是现有图像(取决于它是新的还是创建操作,这可能是 nil),第二个是新上传的图像属性。

我最初的想法是像这样在模型上创建一个 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