Получить путь к файлу ActiveStorage на диске - PullRequest
0 голосов
/ 15 мая 2018

Мне нужно получить путь к файлу на диске, который использует ActiveStorage. Файл хранится локально.

Когда я использовал скрепку, я использовал метод path для вложения, который возвращал полный путь.

Пример:

user.avatar.path

Глядя на Active Storage Docs , казалось, что rails_blob_path поможет. После просмотра того, что он возвратил, он не указывает путь к документу. Таким образом, он возвращает эту ошибку:

Нет такого файла или каталога @ rb_sysopen -

Фон

Мне нужен путь к документу, потому что я использую гем объединить_пдф , чтобы объединить несколько PDF-файлов в один PDF-файл.

Для реализации скрепки я перебрал полные пути выбранных вложений в формате pdf и load переместил их в объединенный файл pdf:

attachment_paths.each {|att_path| report << CombinePDF.load(att_path)}

Ответы [ 4 ]

0 голосов
/ 24 декабря 2018

Я не уверен, почему все остальные ответы используют send(:url_for, key).Я использую Rails 5.2.2 и url_for - публичный метод, поэтому лучше избегать send или просто вызывать path_for:

class User < ApplicationRecord
  has_one_attached :avatar

  def avatar_path
    ActiveStorage::Blob.service.path_for(avatar.key)
  end
end

Стоит отметить, что в представлении вы можете делать такие вещи:

<p>
  <%= image_tag url_for(@user.avatar) %>
  <br>
  <%= link_to 'View', polymorphic_url(@user.avatar) %>
  <br>
  Stored at <%= @user.image_path %>
  <br>
  <%= link_to 'Download', rails_blob_path(@user.avatar, disposition: :attachment) %>
  <br>
  <%= f.file_field :avatar %>
</p>
0 голосов
/ 13 июня 2018

Вы можете загрузить вложение в локальный каталог и затем обработать его.

Предположим, у вас есть в вашей модели:

has_one_attached :pdf_attachment

Вы можете определить:

def process_attachment      
   # Download the attached file in temp dir
   pdf_attachment_path = "#{Dir.tmpdir}/#{pdf_attachment.filename}"
   File.open(pdf_attachment_path, 'wb') do |file|
       file.write(pdf_attachment.download)
   end   

   # process the downloaded file
   # ...
end
0 голосов
/ 06 августа 2018

Просто используйте:

ActiveStorage::Blob.service.send(:path_for, user.avatar.key)

Вы можете сделать что-то подобное на своей модели:

class User < ApplicationRecord
  has_one_attached :avatar

  def avatar_on_disk
    ActiveStorage::Blob.service.send(:path_for, avatar.key)
  end
end
0 голосов
/ 15 мая 2018

Благодаря помощи @muistooshort в комментариях, после просмотра Active Storage Code , это работает:

active_storage_disk_service = ActiveStorage::Service::DiskService.new(root: Rails.root.to_s + '/storage/')
active_storage_disk_service.send(:path_for, user.avatar.blob.key)
  # => returns full path to the document stored locally on disk

Это решение кажется мне немного хакерским. Я хотел бы услышать о других решениях. Это работает для меня, хотя.

...