如何在所有者实体的子路径下提供 ActiveStorage 附件?
How to serve ActiveStorage attachments under a subpath of the owner entity?
这是我想要实现的。给定一个类似这样的模型
class MyModel < ApplicationRecord
has_many_attached :files
end
我希望能够将附件作为文件提供给
GET /mymodels/:id/files/:filename
(文件名也包括格式)。
当然,这假设我的应用程序没有特定 MyModel id 的重复文件名。
是否有推荐的具体方法?
config/routes.rb
完全支持非资源路由(即任意 URL)。他们以您问题中的形式支持动态细分:
get '/mymodels/:id/files/:filename', to: 'mymodels#serve_file'
鉴于上述路线,点击 https://my_app.com/mymodels/1/files/banana.txt
会将请求发送到 MyModelsController
上的 show_files
方法,参数为:
{ id: 1, filename: 'banana.txt' }
Rails Guide 有很多关于资源不足的路由的文档。
编辑:(问题的要点已澄清)
如果您的目的是在点击 URL 时自动下载附件,您的控制器操作可能如下所示:
def serve_file
mymodel = MyModel.find(params[:id])
blob = mymodel.files.blobs.find_by(filename: "#{params[:filename]}.#{params[:format]}")
redirect_to blob.url
end
您必须重新构造文件名,因为 Rails 会自动将路径中的终止元素拆分为 filename
和 format
参数。
注意:我在 :local
存储让 .url
工作的开发中遇到了一些麻烦,但这对实际的远程存储(S3 等)来说工作正常。
如果您打算 display/manipulate 您应用中的文件(即不下载),您应该考虑将文件名作为查询参数传递,而不是将其作为 URI 中的终止元素。
这是我想要实现的。给定一个类似这样的模型
class MyModel < ApplicationRecord
has_many_attached :files
end
我希望能够将附件作为文件提供给
GET /mymodels/:id/files/:filename
(文件名也包括格式)。
当然,这假设我的应用程序没有特定 MyModel id 的重复文件名。
是否有推荐的具体方法?
config/routes.rb
完全支持非资源路由(即任意 URL)。他们以您问题中的形式支持动态细分:
get '/mymodels/:id/files/:filename', to: 'mymodels#serve_file'
鉴于上述路线,点击 https://my_app.com/mymodels/1/files/banana.txt
会将请求发送到 MyModelsController
上的 show_files
方法,参数为:
{ id: 1, filename: 'banana.txt' }
Rails Guide 有很多关于资源不足的路由的文档。
编辑:(问题的要点已澄清)
如果您的目的是在点击 URL 时自动下载附件,您的控制器操作可能如下所示:
def serve_file
mymodel = MyModel.find(params[:id])
blob = mymodel.files.blobs.find_by(filename: "#{params[:filename]}.#{params[:format]}")
redirect_to blob.url
end
您必须重新构造文件名,因为 Rails 会自动将路径中的终止元素拆分为 filename
和 format
参数。
注意:我在 :local
存储让 .url
工作的开发中遇到了一些麻烦,但这对实际的远程存储(S3 等)来说工作正常。
如果您打算 display/manipulate 您应用中的文件(即不下载),您应该考虑将文件名作为查询参数传递,而不是将其作为 URI 中的终止元素。