我知道ActiveStorage url_for(user.avatar)
方法。例如:
<%= link_to "Download this file", url_for(@user.avatar) %>
这很好,但似乎它没有围绕它建立授权。任何拥有此链接的人都可以下载此文档。
过去当我使用paperclip时,我有一个链接转到自定义控制器操作。该自定义控制器操作执行了授权,如果一切正常,则我使用send_file
将文件发送给用户。它是这样的:
def deliver_the_file
authorize :my_authorization
send_file @user.avatar.path
end
如何使用active_storage执行此操作?我所有的工作都是url_for
实现,它根本不授权用户。
我正在专门研究ActiveStorage上Rails指南的Download Files部分。
相关示例代码:
# model
class Book < ApplicationRecord
has_one_attached :book_cover
end
class BooksController < ApplicationController
...
# custom action to authorize and then deliver the active_storage file
def deliver_it
# ... assume authorization already happened
send_file rails_blob_path(@book.book_cover, disposition: "attachment")
end
end
出错并说:
无法读取文件
我也试过这个:
def deliver_it
# ... assume authorization already happened
send_file @book.book_cover.download
end
这返回了错误:
string包含空字节
我也试过这个:
def deliver_it
@book.book_cover.download
end
这返回了错误:
BooksController#deliver_it缺少此请求的模板
我也试过这个:
def deliver_it
send_file @book.book_cover.blob
end
出错并说:
没有将ActiveStorage :: Blob隐式转换为String
答案 0 :(得分:1)
我在这里使用了redirect_to
,它起作用了:
redirect_to rails_blob_path(@book.book_cover, disposition: "attachment")