Мне известен метод ActiveStorage url_for(user.avatar)
. Пример:
<%= link_to "Download this file", url_for(@user.avatar) %>
Это здорово, но похоже, что для этого нет авторизации. Любой, у кого есть эта ссылка, может скачать этот документ.
Раньше, когда я использовал скрепку, у меня была ссылка на настраиваемое действие контроллера. Это настраиваемое действие контроллера выполнило авторизацию, и, если все в порядке, я использовал send_file
для отправки файла пользователю. Это было примерно так:
def deliver_the_file
authorize :my_authorization
send_file @user.avatar.path
end
Как это сделать с active_storage? Все, что у меня получилось, это реализация url_for
, которая вообще не авторизует пользователя.
Я специально смотрю на Загрузить файлы часть руководств Rails по 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 :: Blob в String