URI :: InvalidURIError (неверный URI (не URI?): Nil) Active Storage service_url - PullRequest
1 голос
/ 27 февраля 2020

Информация о конфигурации

rails version 6.0
ruby version 2.7.0
gem 'image_processing', '~> 1.2'

storage.yml

local:
  service: Disk
  root: <%= Rails.root.join("storage") %>

development.rb

config.active_storage.service = :local
Rails.application.routes.default_url_options[:host] = 'localhost:3000'
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }

Это исключение возникает только тогда, когда я использую service= :local. При использовании :amazon оно работает нормально.

user.rb модель

  has_one_attached :avatar

  #throwing exception
  def avatar_urls
    {
      original: avatar.service_url
    } if avatar.attachment
  end

При доступе к avatar_urls выдается исключение (URI::InvalidURIError (bad URI(is not URI?): nil)). Однако, если я изменил свой метод avatars_url на следующий, он работает нормально.

  #working method
  def avatar_urls
    {
      thumbnail: url_for(avatar.variant(resize: "100x100").processed)
    } if avatar.attachment
  end

Вот след:

Disk Storage (5056.7ms) Generated URL for file at key: variants/i5w1ie6ro07mib4qcdn30lmik6wn/2a7fa5dad6ac227a16e961cbd12ca6f35f1d7947f56a97754d5e22c1a0fd3372 ()
cb_app_container | Completed 500 Internal Server Error in 9523ms (ActiveRecord: 580.9ms | Allocations: 1185509)
cb_app_container | URI::InvalidURIError (bad URI(is not URI?): nil):
cb_app_container | app/models/user.rb:53:in `avatar_urls'
cb_app_container | app/models/user.rb:27:in `user_json'
cb_app_container | app/controllers/api/v1/users_controller.rb:13:in `update'
cb_app_container | [ActiveJob] [ActiveStorage::AnalyzeJob] [33448db4-cf54-4677-906c-06b59f1579ee]    (61.6ms)  BEGIN
cb_app_container | [ActiveJob] [ActiveStorage::AnalyzeJob] [33448db4-cf54-4677-906c-06b59f1579ee]   ActiveStorage::Blob Update (10.3ms)  UPDATE "active_storage_blobs" SET "metadata" = $1 WHERE "active_storage_blobs"."id" = $2  [["metadata", "{\"identified\":true,\"width\":1952,\"height\":3264,\"analyzed\":true}"], ["id", 45]]
cb_app_container | [ActiveJob] [ActiveStorage::AnalyzeJob] [33448db4-cf54-4677-906c-06b59f1579ee]    (19.6ms)  COMMIT
cb_app_container | [ActiveJob] [ActiveStorage::AnalyzeJob] [33448db4-cf54-4677-906c-06b59f1579ee] Performed ActiveStorage::AnalyzeJob (Job ID: 33448db4-cf54-4677-906c-06b59f1579ee) from Async(default) in 6916.06ms

1 Ответ

0 голосов
/ 25 марта 2020

Не следует использовать метод service_url для отображения изображений в представлениях для пользователей. Согласно документации:

Возвращает URL-адрес большого двоичного объекта в службе. Этот URL предназначен для кратковременного использования в целях безопасности и не используется напрямую пользователями. Вместо этого service_url должен предоставляться только как перенаправление со стабильного, возможно, аутентифицированного URL-адреса
. Скрытие service_url за перенаправлением также дает вам возможность менять службы без обновления всех URL-адресов. Кроме того, он позволяет кэшировать постоянные URL-адреса, перенаправляющие на service_url, в представление.

Обратите внимание, что при копировании URL-ссылки, созданной url_for(avatar.variant(resize: "100x100").processed), вы увидите, что она перенаправляет вас на изображение, размещенное на Amazon S3.

Эти URL-адреса сервисов рассчитаны на истечение определенного периода времени. Вы можете установить этот лимит времени как здесь: { ссылка }

...