【问题标题】:active_storage/direct_uploads throws 'undefined method 'name' for nil:NilClass' in blob.rb'active_storage/direct_uploads 在 blob.rb 中为 nil:NilClass 抛出“未定义的方法 'name'”
【发布时间】:2021-03-09 21:55:53
【问题描述】:

我在我自己的使用 S3 的项目中看到了这个问题,所以我使用磁盘存储创建了一个小型测试项目并看到了同样的错误。该项目可在https://github.com/pjholmes/test_active_storage 获得,这些步骤在自述文件中重复。

这是我遵循的步骤和错误。我注释掉默认存储服务的原因是因为我每次使用has_one_attached时都会明确给出服务名称。

对于我做错的任何反馈,我显然会很感激。谢谢!

> rails -v
Rails 6.1.3

> rails new test_active_storage -d postgresql -T
> cd test_active_storage
> rails active_storage:install
> rails g scaffold Post title body:text
> rails db:create
> rails db:migrate

编辑/config/storage.yml

public:
  service: Disk
  root: <%= Rails.root.join("tmp/storage/public") %>
  public: true

private:
  service: Disk
  root: <%= Rails.root.join("tmp/storage/private") %>

编辑/app/models/post.rb

class Post < ApplicationRecord
    has_one_attached :public_image, service: :public
    has_one_attached :private_image, service: :private
end

编辑/config/environments/development以注释掉默认存储服务

  # Store uploaded files on the local file system (see config/storage.yml for options).
  # config.active_storage.service = :local

将以下内容添加到/app/views/posts/_form.html.erb

 <div class="field">
    <%= form.label :public_image %>
    <%= form.file_field :public_image %>
  </div>

  <div class="field">
    <%= form.label :private_image %>
    <%= form.file_field :private_image %>
  </div>

将以下内容添加到app/views/posts/show.html.erb

<div>Public Image:</div>
<%= image_tag @post.public_image %>

<div>Private Image:</div>
<%= image_tag @post.private_image %>

在 UI 中创建一些记录并显示它们。工作正常。添加到 active_storage_blobs 的 2 行在 service_name 列中都有正确的服务名称。 (我看到的唯一问题是公共图像需要重定向并在配置中给出public: true,我认为不应该这样做,但我离题了)。

现在试试直接上传...

更改/app/views/posts/_form.html.erb添加直接上传:

  <div class="field">
    <%= form.label :public_image %>
    <%= form.file_field :public_image, direct_upload: true %>
  </div>

  <div class="field">
    <%= form.label :private_image %>
    <%= form.file_field :private_image, direct_upload: true %>
  </div>

尝试添加帖子。添加与之前测试相同的两个文件。结果为 500。

Started POST "/rails/active_storage/direct_uploads" for ::1 at 2021-03-09 13:02:57 -0800
Processing by ActiveStorage::DirectUploadsController#create as JSON
  Parameters: {"blob"=>{"filename"=>"banana.jpg", "content_type"=>"image/jpeg", "byte_size"=>577085, "checksum"=>"W/vo/JqBNmJHMCaL+PRlBQ=="}, "direct_upload"=>{"blob"=>{"filename"=>"banana.jpg", "content_type"=>"image/jpeg", "byte_size"=>577085, "checksum"=>"W/vo/JqBNmJHMCaL+PRlBQ=="}}}
Completed 500 Internal Server Error in 12ms (ActiveRecord: 3.3ms | Allocations: 5864)


  
NoMethodError (undefined method `name' for nil:NilClass):
  
activestorage (6.1.3) app/models/active_storage/blob.rb:52:in `block in <class:Blob>'
activesupport (6.1.3) lib/active_support/callbacks.rb:427:in `instance_exec'
activesupport (6.1.3) lib/active_support/callbacks.rb:427:in `block in make_lambda'
activesupport (6.1.3) lib/active_support/callbacks.rb:235:in `block in halting_and_conditional'
activesupport (6.1.3) lib/active_support/callbacks.rb:516:in `block in invoke_after'
activesupport (6.1.3) lib/active_support/callbacks.rb:516:in `each'
activesupport (6.1.3) lib/active_support/callbacks.rb:516:in `invoke_after'
activesupport (6.1.3) lib/active_support/callbacks.rb:107:in `run_callbacks'
activesupport (6.1.3) lib/active_support/callbacks.rb:824:in `_run_initialize_callbacks'
activerecord (6.1.3) lib/active_record/core.rb:499:in `initialize'
activerecord (6.1.3) lib/active_record/inheritance.rb:72:in `new'
activerecord (6.1.3) lib/active_record/inheritance.rb:72:in `new'
activerecord (6.1.3) lib/active_record/persistence.rb:54:in `create!'
activestorage (6.1.3) app/models/active_storage/blob.rb:127:in `create_before_direct_upload!'
activestorage (6.1.3) app/controllers/active_storage/direct_uploads_controller.rb:8:in `create'
actionpack (6.1.3) lib/action_controller/metal/basic_implicit_render.rb:6:in `send_action'
actionpack (6.1.3) lib/abstract_controller/base.rb:228:in `process_action'
actionpack (6.1.3) lib/action_controller/metal/rendering.rb:30:in `process_action'
actionpack (6.1.3) lib/abstract_controller/callbacks.rb:42:in `block in process_action'
activesupport (6.1.3) lib/active_support/callbacks.rb:117:in `block in run_callbacks'
actiontext (6.1.3) lib/action_text/rendering.rb:20:in `with_renderer'
actiontext (6.1.3) lib/action_text/engine.rb:55:in `block (4 levels) in <class:Engine>'
activesupport (6.1.3) lib/active_support/callbacks.rb:126:in `instance_exec'
activesupport (6.1.3) lib/active_support/callbacks.rb:126:in `block in run_callbacks'
activesupport (6.1.3) lib/active_support/callbacks.rb:137:in `run_callbacks'
actionpack (6.1.3) lib/abstract_controller/callbacks.rb:41:in `process_action'
actionpack (6.1.3) lib/action_controller/metal/rescue.rb:22:in `process_action'
actionpack (6.1.3) lib/action_controller/metal/instrumentation.rb:34:in `block in process_action'
activesupport (6.1.3) lib/active_support/notifications.rb:203:in `block in instrument'
activesupport (6.1.3) lib/active_support/notifications/instrumenter.rb:24:in `instrument'
activesupport (6.1.3) lib/active_support/notifications.rb:203:in `instrument'
actionpack (6.1.3) lib/action_controller/metal/instrumentation.rb:33:in `process_action'
actionpack (6.1.3) lib/action_controller/metal/params_wrapper.rb:249:in `process_action'
activerecord (6.1.3) lib/active_record/railties/controller_runtime.rb:27:in `process_action'
actionpack (6.1.3) lib/abstract_controller/base.rb:165:in `process'
actionview (6.1.3) lib/action_view/rendering.rb:39:in `process'
actionpack (6.1.3) lib/action_controller/metal.rb:190:in `dispatch'
actionpack (6.1.3) lib/action_controller/metal.rb:254:in `dispatch'
actionpack (6.1.3) lib/action_dispatch/routing/route_set.rb:50:in `dispatch'
actionpack (6.1.3) lib/action_dispatch/routing/route_set.rb:33:in `serve'
actionpack (6.1.3) lib/action_dispatch/journey/router.rb:50:in `block in serve'
actionpack (6.1.3) lib/action_dispatch/journey/router.rb:32:in `each'
actionpack (6.1.3) lib/action_dispatch/journey/router.rb:32:in `serve'
actionpack (6.1.3) lib/action_dispatch/routing/route_set.rb:842:in `call'
rack (2.2.3) lib/rack/tempfile_reaper.rb:15:in `call'
rack (2.2.3) lib/rack/etag.rb:27:in `call'
rack (2.2.3) lib/rack/conditional_get.rb:40:in `call'
rack (2.2.3) lib/rack/head.rb:12:in `call'
actionpack (6.1.3) lib/action_dispatch/http/permissions_policy.rb:22:in `call'
actionpack (6.1.3) lib/action_dispatch/http/content_security_policy.rb:18:in `call'
rack (2.2.3) lib/rack/session/abstract/id.rb:266:in `context'
rack (2.2.3) lib/rack/session/abstract/id.rb:260:in `call'
actionpack (6.1.3) lib/action_dispatch/middleware/cookies.rb:689:in `call'
activerecord (6.1.3) lib/active_record/migration.rb:601:in `call'
actionpack (6.1.3) lib/action_dispatch/middleware/callbacks.rb:27:in `block in call'
activesupport (6.1.3) lib/active_support/callbacks.rb:98:in `run_callbacks'
actionpack (6.1.3) lib/action_dispatch/middleware/callbacks.rb:26:in `call'
actionpack (6.1.3) lib/action_dispatch/middleware/executor.rb:14:in `call'
actionpack (6.1.3) lib/action_dispatch/middleware/actionable_exceptions.rb:18:in `call'
actionpack (6.1.3) lib/action_dispatch/middleware/debug_exceptions.rb:29:in `call'
web-console (4.1.0) lib/web_console/middleware.rb:132:in `call_app'
web-console (4.1.0) lib/web_console/middleware.rb:28:in `block in call'
web-console (4.1.0) lib/web_console/middleware.rb:17:in `catch'
web-console (4.1.0) lib/web_console/middleware.rb:17:in `call'
actionpack (6.1.3) lib/action_dispatch/middleware/show_exceptions.rb:33:in `call'
railties (6.1.3) lib/rails/rack/logger.rb:37:in `call_app'
railties (6.1.3) lib/rails/rack/logger.rb:26:in `block in call'
activesupport (6.1.3) lib/active_support/tagged_logging.rb:99:in `block in tagged'
activesupport (6.1.3) lib/active_support/tagged_logging.rb:37:in `tagged'
activesupport (6.1.3) lib/active_support/tagged_logging.rb:99:in `tagged'
railties (6.1.3) lib/rails/rack/logger.rb:26:in `call'
sprockets-rails (3.2.2) lib/sprockets/rails/quiet_assets.rb:13:in `call'
actionpack (6.1.3) lib/action_dispatch/middleware/remote_ip.rb:81:in `call'
actionpack (6.1.3) lib/action_dispatch/middleware/request_id.rb:26:in `call'
rack (2.2.3) lib/rack/method_override.rb:24:in `call'
rack (2.2.3) lib/rack/runtime.rb:22:in `call'
activesupport (6.1.3) lib/active_support/cache/strategy/local_cache_middleware.rb:29:in `call'
actionpack (6.1.3) lib/action_dispatch/middleware/executor.rb:14:in `call'
actionpack (6.1.3) lib/action_dispatch/middleware/static.rb:24:in `call'
rack (2.2.3) lib/rack/sendfile.rb:110:in `call'
actionpack (6.1.3) lib/action_dispatch/middleware/host_authorization.rb:98:in `call'
rack-mini-profiler (2.3.1) lib/mini_profiler/profiler.rb:373:in `call'
webpacker (5.2.1) lib/webpacker/dev_server_proxy.rb:25:in `perform_request'
rack-proxy (0.6.5) lib/rack/proxy.rb:57:in `call'
railties (6.1.3) lib/rails/engine.rb:539:in `call'
puma (5.2.2) lib/puma/configuration.rb:248:in `call'
puma (5.2.2) lib/puma/request.rb:76:in `block in handle_request'
puma (5.2.2) lib/puma/thread_pool.rb:337:in `with_force_shutdown'
puma (5.2.2) lib/puma/request.rb:75:in `handle_request'
puma (5.2.2) lib/puma/server.rb:431:in `process_client'
puma (5.2.2) lib/puma/thread_pool.rb:145:in `block in spawn_thread'

【问题讨论】:

    标签: ruby-on-rails rails-activestorage


    【解决方案1】:

    我终于找到了原因(我有同样的错误,但在更基本的情况下),我没有

    config.active_storage.service = :local
    

    设置。设置它是让它工作的关键。查看active_storage gem (lib/active_storage/engine.rb) 中的代码

    ActiveStorage::Blob.services = ActiveStorage::Service::Registry.new(configs)
    
    if config_choice = Rails.configuration.active_storage.service
      ActiveStorage::Blob.service = ActiveStorage::Blob.services.fetch(config_choice)
    end
    

    很难看出如何创建在存储时选择的多个服务,因为为 service_name 赋值而运行的代码是在 ActiveStorage::Blob (app/models/active_storage/blob.rb) 的初始化程序中运行的:

    after_initialize do
      self.service_name ||= self.class.service.name
    end
    

    但是,如果您像我一样没有添加行来配置您的 active_storage 服务,那么您会想要这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-09
      • 1970-01-01
      • 2011-07-27
      • 2013-06-30
      相关资源
      最近更新 更多