Проблема Rails ActiveStorage: ошибка «файл не найден» для rails_blob_path, даже если путь работает вручную - PullRequest
0 голосов
/ 23 мая 2019

У меня есть небольшое приложение на Rails, которое отлично работает локально, загружая файл docx с помощью ActiveStorage и конвертируя его в html (среди прочего).Чтобы развернуть это в Heroku, мне нужно перейти от использования локальной файловой системы для хранения к использованию S3 и, таким образом, изменить способ генерации пути к файлу.

Мое исследование показывает, что rails_blob_path (или _url) должно быть тем, что мне нужно, но я получаю ошибку "файл не найден", даже если путь к файлу работает, когда я пытаюсь сделать это вручную.

Как мне сгенерировать путь для прикрепленного файла, который я могу использовать для дальнейшего преобразования?Документы говорят, что это просто, но я не могу заставить его работать!


В моем приложении есть проекты, к каждому из которых должен быть прикреплен файл через ActiveStorage.После создания проекта (с приложенным файлом) файл обрабатывается, и его содержимое отображается для пользователя (извлечение текста из файла Word, сопоставление его со списками слов и сохранение полученного HTML и списков слов для дальнейшего руководства).редактирование пользователем).

Мой оригинальный подход состоял в том, чтобы этот метод был в модели проекта:

def real_file_path
  ActiveStorage::Blob.service.send(:path_for, file.key)
end

А затем в контроллере я вызвал этот метод для выполнения фактического преобразования:

def convert_docx_file
  _file_contents = ''
  _doc = Docx::Document.open(@project.real_file_path)
  _doc.paragraphs.each do |p|
    _file_contents += p.to_html
  end
  @project.update_attributes(file_contents: _file_contents)
end

(При этом используется гем DOCX для создания подходящего объекта, а затем итерации по нему и преобразования абзацев в HTML.)

Теперь проблематичным шагом является создание _doc.объект.Приведенный выше код отлично работает на локальной файловой системе.Для использования S3, после значительного количества исследований и экспериментов, я изменил его на:

.
.
  _doc = Docx::Document.open(rails_blob_path(@project.file))
.
.
.

При запуске на моей локальной машине это выдает ошибку: Zip::Error in ProjectsController#show File /rails/active_storage/blobs/BLAH_BLAH_BLAH/original%20file.docx not found.Но когда я затем копирую и вставляю адрес в браузер, он загружается нормально.

Может кто-нибудь дать мне знать, как получить правильный путь к файлу, чтобы я мог снова выполнить преобразование?

1 Ответ

0 голосов
/ 24 мая 2019

Итак, в конце я обошел проблему, создав загрузчик в классе обслуживания, подробности которого я оставлю всем, у кого может быть такая же проблема.

Соответствующая строка вконтроллер теперь:

_doc = DocxDownloadService.new(@project.file).doc

И класс обслуживания (app/services/docx_download_service.rb) более или менее прямой из документации ActiveStorage:

class DocxDownloadService
  include ActiveStorage::Downloading
  attr_reader :blob

  def initialize(blob)
    @blob = blob
  end

  def doc
    download_blob_to_tempfile do |file|
      Docx::Document.open(file)
    end
  end
end

Это работает как локально (в моей файловой системе)) и на сервере, используя S3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...