我有一个使用 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
任何帮助将不胜感激。
提前致谢