我正在使用Active admin编辑我的应用程序中的所有模型,并且以前使用过回形针。 在此应用中,我将Active Storage on和Activity模型与以下各项配合使用:
has_many_attached :images
我发现这种可以上传多张图片的方法
form do |f|
columns do
column do
f.inputs do
[removed stuff here]
f.input :images, as: :file, input_html: { multiple: true }
end
f.submit
end
end
end
但是我真的希望能够查看,更改或删除表单中的单个图像,并为每个图像提供单独的输入字段,并在列表末尾添加一个字段以添加另一个图像。我怎么做?甚至可行吗?
答案 0 :(得分:0)
可能您可以做类似的事情,
ParentModel
has_many:child_models
accepts_nested_attributes_for :child_models, :allow_destroy => true
ChildModel
Belongs_to :parent_model
has_one_attched :image
form do |f|
columns do
column do
f.inputs do
f.inputs "images" do
f.has_many :child_models do |cm|
cm.input :image, label: "Add picture", :as => :file
end
end
end
f.submit
end
end
end
答案 1 :(得分:0)
尽管roshiend的方法被否决了,但我认为它对我来说很好,因此我尝试了一下。以下代码有效,但仅适用于创建新的附件Blob。尽管有解决方法,但更新时它仍无法正常工作。
这似乎发现了(对于我而言)嵌套多态资源在AA中的错误,因此在提出AA问题之前,我要伸出援手查看我是否做错了什么。谁能看到我在哪里出错了?
在嵌套形式中,使用ActiveStorage作为文件上传器时,多态图像附件不会上传新文件(替换现有文件时),也不会显示为图像提示。
当编辑带有附加图像斑点的资源时,我希望(1)能够使用“提示:”显示一个小的缩略图,并且我希望在选择新文件时覆盖旧文件。我希望(2)将此资源嵌套到另一个资源中时,具有相同的行为,并实现带有f.has_many的形式。
期望(1)正常。但是实施(2)后,我发现旧文件没有被新文件覆盖(返回Completed 304 Not Modified
)。此外,如果我尝试使用“提示:”在子表单中显示缩略图,则会出现异常
Can't resolve image into URL: to_model delegated to attachment, but attachment is nil
似乎问题在于has.many内.image方法与附件对象失去联系。
给出一个模型和一个多态附件模型:
class PayloadKind < ApplicationRecord
has_many :attachments, as: :attachable
accepts_nested_attributes_for :attachments, allow_destroy: true
end
class Attachment < ApplicationRecord
belongs_to :attachable, polymorphic: true
has_one_attached :image
end
首先,查看附件的表单
ActiveAdmin.register Attachment do
permit_params :name, :image
form do |f|
f.inputs "attachment" do
f.input :name
f.input :image, as: :file, hint: image_tag(f.object.image.variant(resize_to_limit: [100,100])) # hint: works fine
end
f.actions # uploads a new file if the user wants a change
end
当我查看表单时,图像提示显示得很好。当我使用上述形式执行更新时,指定了一个新文件来替换旧文件,日志显示预期的行为
ActiveStorage::Blob Load (0.2ms) SELECT "active_storage_blobs".* FROM "active_storage_blobs" WHERE "active_storage_blobs"."id" = $1 LIMIT $2 [["id", 52], ["LIMIT", 1]]
Disk Storage (0.1ms) Checked if file exists at key: variants/vw057sxlchfi6omkig359sa893hs/6fc72cc8335bf38f78ee581ac0cfbf2ff591b7f70c9c06b30882cae6844770c8 (no)
Disk Storage (0.7ms) Downloaded file from key: vw057sxlchfi6omkig359sa893hs
Disk Storage (0.4ms) Uploaded file to key: variants/vw057sxlchfi6omkig359sa893hs/6fc72cc8335bf38f78ee581ac0cfbf2ff591b7f70c9c06b30882cae6844770c8
现在编辑相同的附件实例,但嵌套在PayloadKind的表单中
ActiveAdmin.register PayloadKind do
permit_params :id, :name, :variety, :description, attachments_attributes: [:name, :image, :id, :attachable_id, :attachable_type, :_destroy]
form do |f|
f.semantic_errors
f.inputs "parameters" do
f.input :name
f.input :variety
f.input :description
f.object.attachments.each do |at|
span image_tag(at.image.variant(resize_to_limit: [100,100])) # This works fine
end
f.has_many :attachments, allow_destroy: true do |at|
at.input :name
at.input :image, as: :file, hint: image_tag(at.object.image) # The hint: bombs.
end
end
f.actions
end
我在日志中看不到ActiveStorage活动,仅以Completed 304
但是创建新的图像附件没有问题,图像可以上传。
===
未显示图像提示的解决方法是在f.has_many块之外使用image_tag,如果不如我所愿,它可以工作。
不上传新图像的解决方法是先删除嵌套对象,然后再添加一个新对象。