通过自定义控制器操作向用户发送ActiveStorage文件

时间:2018-05-10 23:04:11

标签: ruby-on-rails rails-activestorage

我知道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

1 个答案:

答案 0 :(得分:1)

我在这里使用了redirect_to,它起作用了:

redirect_to rails_blob_path(@book.book_cover, disposition: "attachment")