【问题标题】:ruby-on-rails initializer not working in irb, but working when running app normallyruby-on-rails 初始化程序在 irb 中不工作,但在正常运行应用程序时工作
【发布时间】:2015-02-03 16:56:19
【问题描述】:

我有一个想法,为我的业余项目编写一个小型 redis 包装器库。 到目前为止,一切看起来都很棒。 现在,我正在尝试对我的配置进行润色,我受到 airbrake 项目的配置块代码的启发,reference article here

从一开始,我就立即着手编写包装类,并且及时完成了。到目前为止,我需要做的是我希望能够在 irb 或 pry 中测试我的配置代码块 (config/initializers/redis_cli.rb)。
我不确定为什么我的初始化代码(位于 rails 项目配置/初始化程序下)在这样的调试控制台环境中不起作用。

当我在控制台中实例化我的 RedisCli 类时 =>

 RedisCli.new

我收到一条错误消息 "NoMethodError: 未定义方法host' for nil:NilClass from /Users/admin/rails_projects/redis_app/lib/redis_cli.rb:44:inredis_wrapper_options'"

相比之下,它在内部网络服务器、网络砖上运行时效果很好。 似乎我的 RedisCli 初始化程序没有在 irb 中正确加载。

这是我的代码:

lib/redis_cli.rb

class RedisCli


  attr_accessor :host,:port,:db,:url,:queue

  class << self
    attr_accessor :configuration
  end

  def self.configure
    self.configuration ||= Configuration.new
    yield(configuration)
  end  

  class Configuration
    attr_accessor :host,:port,:db,:queue

    def initialize

    end
  end 

  def initialize(options={})
    options = redis_wrapper_options(options)
    @host = options[:host]
    @port = options[:port]
    @db = options[:db]
    @queue = options[:queue]
  end

  def url
    @url ||= [@host,@port].reject(&:blank?).join(":") if @url.blank?
    @url       
  end

  def lpush(klass,args)
    redis = Redis.new(:url => url)
    msg = { 'class' => klass,'args' =>  [args],'jid' => SecureRandom.hex(12), 'retry' => true, 'enqueued_at' => Time.now.to_f }
    redis.lpush(@queue,JSON.dump(msg))
  end

  def redis_wrapper_options(overrides = {})      
    {
      :host  => RedisCli.configuration.host,
      :port => RedisCli.configuration.port,    
      :db => RedisCli.configuration.db,        
      :queue   => RedisCli.configuration.queue

    }.merge(overrides || {}).delete_if { |key, value| value.nil? }
  end

end

还有我的初始化器:

config/initializers/redis_cli.rb

RedisCli.configure do |config|
  config.host    = 'redis://localhost'       
  config.port    = '6379'       
  config.db      = ''       
  config.queue   = 'queue:default'                      
end

谁能告诉我这个问题?

【问题讨论】:

  • 在您的 def self.configure 方法中,您是否尝试将 self.configuration 更改为 @configuration ||= Configuration.new(用于您的记忆)?使用 self vs @ 将以不同的方式引用变量,并可能导致这种情况。 (stackoverflow.com/questions/1693243/instance-variable-self-vs) 很好地解释了 self 与 @ 的情况。
  • 谢谢克里斯。我根据您的建议进行了更改,但不幸的是它似乎不起作用。仍然收到相同的错误,“NoMethodError: undefined method host' for nil:NilClass”。有什么想法吗?
  • stackoverflow.com/questions/18553944/… 可能会有所帮助,尽管我发现我的初始化程序有时rails c 上运行,但并非总是如此。我无法解释这种行为。
  • 您输入的是irb,还是bundle exec rails c之类的?
  • 嗨,布拉德,我通常运行“rails c”,在您发布后我还尝试了“bundle exec rails c”,但似乎都不起作用。但是,您给我带来了一个想法,这很可能是应用程序范围内的错误配置问题。我将在一个新创建的项目上尝试代码。让我们看看它是如何工作的。

标签: ruby-on-rails ruby config


【解决方案1】:

我在 Rails 5.1.4 上也遇到过这种情况

唯一对我有用的是完全退出Terminal.app,重新启动Terminal.app,然后重新运行rails c。 Rails 控制台的初始化时间比我重新启动终端之前的时间长了大约 4-5 秒。似乎有某种缓存正在进行,但这只是一种预感。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-17
    • 2019-08-20
    • 2020-11-01
    • 2018-11-02
    • 2019-01-12
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    相关资源
    最近更新 更多