在模型上编辑图像时,如何使用ActiveStorage has_many_attached我的活动管理员?

时间:2018-09-04 13:53:41

标签: ruby-on-rails activeadmin rails-activestorage

我正在使用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

但是我真的希望能够查看,更改或删除表单中的单个图像,并为每个图像提供单独的输入字段,并在列表末尾添加一个字段以添加另一个图像。我怎么做?甚至可行吗?

2 个答案:

答案 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,如果不如我所愿,它可以工作。

不上传新图像的解决方法是先删除嵌套对象,然后再添加一个新对象。