我正在从回形针迁移到 Rails 5.2 和主动存储。我仅使用 Rails 作为 API。
如何获取has_many_attached :images的 URL 路径
这是有效的单个文件的代码:
class UserSerializer < ActiveModel::Serializer
include Rails.application.routes.url_helpers
attributes %i[email name username]
....
  attribute :verification_url do
    if object.verification_file.attachment
      URI.join(ActionController::Base.asset_host, rails_blob_path(object.verification_file))
    end
  end
....
end
当我尝试对多图像执行类似的操作时,我只是获取这些图像,而不是它们的 URL。
 include Rails.application.routes.url_helpers
 attributes :id, :name, :description, :images
 def images
  if object.images.attachments
    object.images.each do |image| 
      URI.join(ActionController::Base.asset_host, rails_blob_path(image))
    end
  end 
end
我需要按 2 个属性对集合进行排序。一个是常规属性,我将其命名attr为另一个属性,另一个是 ActiveStorage 附件的名称。问题是,由于 ActiveStorage 定义关系的方式,我无法连接其表以按其属性之一进行排序。
这大致就是我想要做的:
class Document < ApplicationRecord
  has_one_attached :file
  scope :sorted, -> { joins(:file).order(attr: :asc, 'files.filename': :asc) }
end
我知道files不是表的名称,这只是一个例子。我搞乱了 ActiveStorage 的表名,甚至尝试使用 ActiveStorage::Attachment 和 ActiveStorage::Blob 手动定义关系,但没有成功。
关于如何实现这一目标有什么想法吗?
我正在上传一个 CSV 文件,该文件在将行导入数据库时遇到问题:
Encoding::UndefinedConversionError ("\xCC" from ASCII-8BIT to UTF-8)
确保每列正确编码以放入数据库或被忽略的最有效方法是什么?
最基本的方法是遍历每一行和每个字段并强制对字符串进行编码,但这似乎效率非常低。处理这个问题的更好方法是什么?
目前它只是作为参数上传( :csv_file)。然后我按如下方式访问它:
CSV.parse(csv_file.download)模型内。
我假设在 activestorage 文件上调用 CSV.parse 时有一种方法可以强制编码,但不确定如何进行。有任何想法吗?
谢谢!
我正在尝试将 Rails 的Active Storage中的图像嵌入到 Prawn PDF 中。
这是我在 Prawn PDF 课程中得到的内容:
path = @view.rails_blob_url(@logo, :host => "localhost:3000", :protocol => "http", :locale => nil)
image(path, :vposition => :center)
当我尝试打开 PDF 时,出现以下错误:
InvoicesController 中的 ArgumentError #show http://localhost:3000/rails/active_storage/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBGdz09IiwiZXhwIjxudWxsHCJwdXIiOiJibG9iX2lkIn19--06167c36c283f6d5de63ae306 b721310af11f70e/Test-Logo.png 未找到
当我将完全相同的 URL 复制到浏览器中时,图像会按预期显示。5分钟后就过期了(?)。
我在这里缺少什么?
如何在 PDF 中显示图像?
为什么图像可以在浏览器中呈现,但不能在我的 PDF 中呈现?
我今天花了一整天的时间试图让它发挥作用,但没有成功。
我正在将一个对权限敏感的应用程序迁移到 ActiveStorage。我需要确保文件只能由具有权限的人访问,并且这些权限仅持续指定的时间段。
使用 Paperclip,这就像使用专家授权调用定义路线一样简单:
def thumbnail
    authorize @record
    redirect_to @record.thumbnail.expiring_url(300)
end
任何调用都/record/thumbnail将由 devise 进行身份验证,由 pundit 授权,然后使用过期的 URL 重定向到 S3。这是一个有效的过程。
转向 ActiveStorage,我最初的想法是我会使用service_url,但它仅在我使用 S3 时才有效 - 它在测试中不起作用,如果我在使用磁盘服务进行本地开发时它不起作用。实际的“正确”方法是使用url_for, 或 在上面的示例中redirect_to url_for @record.thumbnail。
问题是,url_for似乎发出了一个永久 url——它生成的 url 对任何人来说始终有效,无需身份验证或授权。更重要的是,一旦有人拥有了那个网址,我就无法撤销它,我不能说它只有效一周。一旦某人拥有该 URL,他们就可以永远访问该文件。(或者,大概,至少在文件更新之前)。
我不认为这是一个巨大的安全缺陷,但这绝对是使用 Paperclip 所能实现的目标的倒退。我是否遗漏了一个重要的细节,或者这真的是 ActiveStorage 所能做到的一切吗?
在我的应用程序中,管理员用户可以建议和编辑其他用户的个人资料。我希望管理员用户能够为非管理员用户建议一个(新的)头像。目前我的用户(用户=spkr在我的应用程序中)模型具有:
has_one_attached :image
has_one_attached :edited_image
哪里image是用户选择的头像图片,哪里edited_image是管理员用户建议的头像图片。
当使用管理“更新”表单时,edited_image设置
if spkr_params[:edited_image].present?
  @spkr.edited_image = spkr_params[:edited_image]
end
这成功地将附件设置为edited_image.
当管理员用户提交编辑时,非管理员用户会收到一封确认电子邮件。单击时,我希望image非管理员用户的 进行更新。
...
if @spkr.edited_image.present?
   @spkr.image.purge
   @spkr.image = @spkr.edited_image
end
@spkr.save!
但是我收到以下错误@spkr.save!:
Could not find or build blob: expected attachable, got #<ActiveStorage::Attached::One:0x00007fdcc44fa440 @name="edited_image", @record=#<Spkr id: 154... >>
这是edited_image来自@spkr:
@spkr.edited_image
=> #<ActiveStorage::Attached::One:0x00007fdcc44fa440 @name="edited_image", @record=#<Spkr id: 154...>>
我的感觉是 @spkr.edited_image 不是 @spkr.edited_image 的“可附加部分”,但我不确定如何解决这个问题。
感谢您的任何帮助。
我正在尝试使用ActiveStorage将 Rails 应用程序升级到 RoR6 。\n在视图中,我image_tag在所附图像上使用了名为“whiteboard_background”的图像@project。
它在浏览器中显示损坏的链接:\n链接
\n\n环境:开发和本地存储的文件
\n\n模型:
\n\nclass Project < ApplicationRecord\n\n  has_one_attached :whiteboard_background\n查看代码:
\n\nattachment: <%= @project.whiteboard_background.attached? %>\n<p>image:\n<%= image_tag @project.whiteboard_background if @project.whiteboard_background.attached? %>\n</p>\n服务器:
\n\nStarted GET "/projects/6" for 127.0.0.1 at 2020-02-19 20:29:27 +0100\nProcessing by ProjectsController#show as HTML\n  Parameters: {"id"=>"6"}\n...\nActiveStorage::Attachment Load (2.8ms)  SELECT "active_storage_attachments".* FROM "active_storage_attachments" WHERE "active_storage_attachments"."record_id" = $1 AND "active_storage_attachments"."record_type" = $2 AND "active_storage_attachments"."name" = $3 LIMIT $4  [["record_id", 6], ["record_type", "Project"], ["name", "whiteboard_background"], …在我的 Rails v5.2.4.1 应用程序 (ruby v2.6.1) 中,我使用工作查询加载一堆消息。每条消息都有belongs_to一个:usermodel 和 user has_one_attached :photo。我渴望向用户加载所有这样的消息:
Message.<query>.includes(:user)
现在,这段代码photo.attached? ? photo : 'default_avatar.png'会产生如下查询:
SELECT  "active_storage_attachments".* FROM "active_storage_attachments" WHERE "active_storage_attachments"."record_id" = $1 AND "active_storage_attachments"."record_type" = $2 AND "active_storage_attachments"."name" = $3 LIMIT $4  [["record_id", 32], ["record_type", "User"], ["name", "photo"], ["LIMIT", 1]]
我如何立即加载user.photo我user.photo.attached?的查询?
我有以下模型:
class Section < ApplicationRecord
  has_many_attached :files
  def to_dir
    [client.to_dir, operation.to_dir, self.name.parameterize].join('/')
  end
  after_save :transload_files
  def transload_files
    TransloadService.sync( self.to_dir, self.files )
  end
end
方法transload_files是问题。这是转运服务:
class TransloadService
    class << self
        def sync(check_dir, files)
            # First we have to check the transload dir for files that have been deleted on the app
            transloaded_files = Request.list(check_dir)
            cull_list = transloaded_files.reject{ |e| files.map{|t| t.filename }.include? Request.filename(e)}
            if cull_list.count > 0
                Request.trim(cull_list)
                p "#{cull_list.count} files trimed from #{check_dir}."
            end
            # Next we have to …我在使用 Active Storage 的 Rails 6 应用程序中遇到了一个非常奇怪的问题。
\n您可以将 PDF 文件添加到反馈中,该文件通过 Active Storage 存储 - 在开发中,这可以正常工作,您可以保存并打开它。
\n它在生产中也可以工作,但当我使用 Capistrano 重新部署应用程序时,问题出现了。部署之前,到目前为止保存的所有文件都显示没有问题。重新部署后,不再找到之前存储的文件 - 数据库没有任何更改。
\n这是我的视图代码(我也尝试使用url_for,rails_blob_path并service_url通过控制器)
这就是我的日志在重新部署之前所说的内容(成功显示文件):
\nStarted GET "/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSWhNREZuWjJNek9HeDZNV1ZvT0RWaFkyZDFkVGQ2YW04NU5XdzBkQVk2QmtWVU9oQmthWE53YjNOcGRHbHZia2tpWkdsdWJHbHVaVHNnWm1sc1pXNWhiV1U5SWxkbFlrMWxiblZsSUZCeWIzTmxiblJoZEdsdmJpNXdaR1lpT3lCbWFXeGxibUZ0WlNvOVZWUkdMVGduSjFkbFlrMWxiblZsSlRJd1VISWxRek1sUWpWelpXNTBZWFJwYjI0dWNHUm1CanNHVkRvUlkyOXVkR1Z1ZEY5MGVYQmxTU0lVWVhCd2JHbGpZWFJwYjI0dmNHUm1CanNHVkE9PSIsImV4cCI6IjIwMjAtMDctMTRUMTg6MDg6MjIuOTQ5WiIsInB1ciI6ImJsb2Jfa2V5In19--0a52cfc77ce14105dc290ff569d50b637231f613/WebMenue%20Pr%C3%B5sentation.pdf?content_type=application%2Fpdf&disposition=inline%3B+filename%3D%22WebMenue+Prosentation.pdf%22%3B+filename%2A%3DUTF-8%27%27WebMenue%2520Pr%25C3%25B5sentation.pdf" for 172.16.118.100 at 2020-07-14 20:03:48 +0200\n\nProcessing by ActiveStorage::DiskController#show as PDF\n\nParameters: {"content_type"=>"application/pdf", "disposition"=>"inline; filename=\\"WebMenue Prosentation.pdf\\"; filename*=UTF-8''WebMenue%20Pr%C3%B5sentation.pdf", "encoded_key"=>"eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSWhNREZuWjJNek9HeDZNV1ZvT0RWaFkyZDFkVGQ2YW04NU5XdzBkQVk2QmtWVU9oQmthWE53YjNOcGRHbHZia2tpWkdsdWJHbHVaVHNnWm1sc1pXNWhiV1U5SWxkbFlrMWxiblZsSUZCeWIzTmxiblJoZEdsdmJpNXdaR1lpT3lCbWFXeGxibUZ0WlNvOVZWUkdMVGduSjFkbFlrMWxiblZsSlRJd1VISWxRek1sUWpWelpXNTBZWFJwYjI0dWNHUm1CanNHVkRvUlkyOXVkR1Z1ZEY5MGVYQmxTU0lVWVhCd2JHbGpZWFJwYjI0dmNHUm1CanNHVkE9PSIsImV4cCI6IjIwMjAtMDctMTRUMTg6MDg6MjIuOTQ5WiIsInB1ciI6ImJsb2Jfa2V5In19--0a52cfc77ce14105dc290ff569d50b637231f613", "filename"=>"WebMenue Pr\xc3\xb5sentation"}\n\nCompleted 304 Not Modified in 1ms (ActiveRecord: 0.0ms | Allocations: 370)\n然后,重新部署后,我在完全相同的文件上收到此 404 未找到错误:
\nStarted GET "/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSWhNREZuWjJNek9HeDZNV1ZvT0RWaFkyZDFkVGQ2YW04NU5XdzBkQVk2QmtWVU9oQmthWE53YjNOcGRHbHZia2tpWkdsdWJHbHVaVHNnWm1sc1pXNWhiV1U5SWxkbFlrMWxiblZsSUZCeWIzTmxiblJoZEdsdmJpNXdaR1lpT3lCbWFXeGxibUZ0WlNvOVZWUkdMVGduSjFkbFlrMWxiblZsSlRJd1VISWxRek1sUWpWelpXNTBZWFJwYjI0dWNHUm1CanNHVkRvUlkyOXVkR1Z1ZEY5MGVYQmxTU0lVWVhCd2JHbGpZWFJwYjI0dmNHUm1CanNHVkE9PSIsImV4cCI6IjIwMjAtMDctMTRUMTg6MTI6MzQuNTE3WiIsInB1ciI6ImJsb2Jfa2V5In19--9d281265e57a7c0d3cd53af1f8e1a6e098605d3c/WebMenue%20Pr%C3%B5sentation.pdf?content_type=application%2Fpdf&disposition=inline%3B+filename%3D%22WebMenue+Prosentation.pdf%22%3B+filename%2A%3DUTF-8%27%27WebMenue%2520Pr%25C3%25B5sentation.pdf" for 172.16.118.100 at 2020-07-14 20:07:34 +0200\n\nProcessing by ActiveStorage::DiskController#show …