【问题标题】:make files uploaded with carrierwave accessible only to activeadmin users使使用carrierwave上传的文件只有activeadmin用户可以访问
【发布时间】:2021-07-07 13:53:25
【问题描述】:
我正在使用carrierwave上传一些文件
class Document < ApplicationRecord
mount_uploader :pdf_file, MyPdfUploader
class MyPdfUploader < CarrierWave::Uploader::Base
storage :file
def store_dir
"uploads/#{model.class.to_s.underscore}/#{model.id}"
end
我现在希望只有经过 activeadmin 身份验证的用户才能访问此文件。
实现这一目标的正确方法是什么?
【问题讨论】:
标签:
ruby-on-rails
activeadmin
carrierwave
【解决方案1】:
默认情况下,Carrierwave 会将文件存储在 public/ 的子文件夹中,因此可以访问这些文件。您可以将 store_dir 设置为:
def store_dir
"#{Rails.root}/private/pdfs/#{model.class.to_s.underscore}/#{model.id}"
end
然后在您的 activeadmin 资源文件中,您可以通过自定义 member_action 使其可用,例如:
member_action :download, :method => :get do
if resource.pdf_file.present?
send_file(
IO.read(resource.pdf_file.file.path),
:filename => "#{resource.pdf_file.filename}",
:type => resource.pdf_file.content_type
) and return
else
flash[:notice] = "No pdf present"
redirect_to resource_path and return
end
end