如何在所有者实体的子路径下提供 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 会自动将路径中的终止元素拆分为 filenameformat 参数。

注意:我在 :local 存储让 .url 工作的开发中遇到了一些麻烦,但这对实际的远程存储(S3 等)来说工作正常。

如果您打算 display/manipulate 您应用中的文件(即不下载),您应该考虑将文件名作为查询参数传递,而不是将其作为 URI 中的终止元素。