Мне известен метод 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
, которая вообще не авторизует пользователя.
Я специально смотрю на Скачать файлы части Rails Guides на ActiveStorage.
Соответствующий пример кода:
# 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
Это вернуло ошибку:
строка содержит нулевой байт
И я также попытался это:
def deliver_it
@book.book_cover.download
end
Это вернуло ошибку:
BooksController # delivery_it отсутствуетшаблон для этого запроса
Я также пробовал это:
def deliver_it
send_file @book.book_cover.blob
end
Эта ошибка и говорит:
нет неявного преобразования ActiveStorage ::Капля в строку