【问题标题】:NoMethodError: private method `warn' called for nil:NilClassNoMethodError:为 nil 调用私有方法“警告”:NilClass
【发布时间】:2018-06-18 09:22:56
【问题描述】:

我正在尝试使用 capistrano 为我的 rails 应用程序实现服务器部署。我是第一次这样做。现在,我陷入了NoMethodError。我找不到问题

我的 Gemfile 包含以下 gems

group :development do
  gem 'capistrano', require: false
  gem 'capistrano3-puma', require: false
  gem 'capistrano-rails', require: false
  gem 'capistrano-bundler', require: false
  gem 'capistrano-rbenv', require: false
end

application.rb

require_relative 'boot'
require "rails"
# Pick the frameworks you want:
require "active_model/railtie"
require "active_job/railtie"
require "active_record/railtie"
require "active_storage/engine"
require "action_controller/railtie"
require "action_mailer/railtie"
require "action_view/railtie"
require "action_cable/engine"
require "sprockets/railtie"
# require "rails/test_unit/railtie"

# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)

module Server
  class Application < Rails::Application
   # Initialize configuration defaults for originally generated Rails   version.
    config.load_defaults 5.2
  end
end

现在执行命令时出现以下错误

cap production deploy

  deploy:assets:precompile
  01 $HOME/.rbenv/bin/rbenv exec bundle exec rake assets:precompile
  01 (in /home/ruby-user/server)
  01 rake aborted!
  01 NoMethodError: private method `warn' called for nil:NilClass
  01 /home/ruby-user/server/shared/bundle/ruby/2.5.0/gems/sprockets-rails-3.2.1/lib/sprockets/railtie.rb:170:in `build_environment'
  01 /home/ruby-user/server/shared/bundle/ruby/2.5.0/gems/railties-5.2.0/lib/rails/railtie.rb:190:in `public_send'
  01 /home/ruby-user/server/shared/bundle/ruby/2.5.0/gems/railties-5.2.0/lib/rails/railtie.rb:190:in `method_missing'
  01 /home/ruby-user/server/shared/bundle/ruby/2.5.0/gems/sprockets-rails-3.2.1/lib/sprockets/rails/task.rb:21:in `environment'
  01 /home/ruby-user/server/shared/bundle/ruby/2.5.0/gems/sprockets-3.7.1/lib/rake/sprocketstask.rb:42:in `cached'
  01 /home/ruby-user/server/shared/bundle/ruby/2.5.0/gems/sprockets-rails-3.2.1/lib/sprockets/rails/task.rb:46:in `manifest'
  01 /home/ruby-user/server/shared/bundle/ruby/2.5.0/gems/sprockets-3.7.1/lib/rake/sprocketstask.rb:143:in `with_logger'
  01 /home/ruby-user/server/shared/bundle/ruby/2.5.0/gems/sprockets-rails-3.2.1/lib/sprockets/rails/task.rb:67:in `block (2 levels) in d…
  01 /home/ruby-user/server/shared/bundle/ruby/2.5.0/gems/rake-12.3.1/exe/rake:27:in `<top (required)>'
  01 /home/ruby-user/.rbenv/versions/2.5.0/bin/bundle:23:in `load'
  01 /home/ruby-user/.rbenv/versions/2.5.0/bin/bundle:23:in `<main>'
  01 Tasks: TOP => assets:precompile
  01 (See full trace by running task with --trace)

/home/ruby-user/server/shared/bundle/ruby/2.5.0/gems/sprockets-rails-3.2.1/lib/sprockets/railtie.rb第170行有如下语句

::Rails.logger.warn "Application uninitialized: Try calling YourApp::Application.initialize!"

请帮我整理一下。谢谢

【问题讨论】:

  • 可能无法解决您的问题,但您很可能需要 capistrano gems 进行开发,而不是生产或登台。
  • +1 BM5k 的评论。你永远不应该在生产中包含 capistrano gems。他们属于开发组。他们也应该始终是require: false。请参阅:github.com/capistrano/rails#installation 这适用于 所有 capistrano-* gem。
  • 好的,谢谢。我已经在我的代码中更新了它,我也会更新这个问题。但问题仍然存在。这是 Rails:logger 的问题吗?我们是否必须在任何文件中包含 Rails 记录器?

标签: ruby-on-rails capistrano


【解决方案1】:

看来您必须在应用程序中设置 Rails.logger.warn。在环境文件中试试这个

Rails.logger = Logger.new(STDOUT)

【讨论】:

  • 在 production.rb 文件中的 Rails.application.configure 内部?
【解决方案2】:

我收到了这个错误,事实证明我在我的 config/ 文件夹中包含了我的 config.ru 的副本。当它在那里时,它无法访问此变量,因此会引发该错误;只需删除重复项,它应该可以工作。

【讨论】:

    【解决方案3】:

    你需要通过运行export RAILS_ENV=&lt;-- environment_name --&gt;来指定环境

    执行此操作,然后继续您的部署步骤。

    【讨论】:

      猜你喜欢
      • 2014-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多