在.irbrc中重载Rails模块的类方法

时间:2011-09-29 14:59:32

标签: ruby-on-rails ruby-on-rails-3 console autoload irb

我有一个Rails 3应用程序,其中有一位住在lib的演示者。相关部分如下:

lib/channels/channel.rb

module Channels
  class Channel
    def current_user
      ApplicationController.current_controller.try(:current_or_guest_user)
    end

    def self.find_by_key(key)
      @@channels.find { |c| c.key == key.to_sym }
    end

    private

    def self.class_initialize
      @@channels = []
      Dir.glob("#{Rails.root}/lib/channels/channel_defs/*.rb").each do |f|
        require_dependency f
        @@channels << "Channels::#{File.basename(f, '.rb').camelize}".constantize.new
      end
    end

    class_initialize
  end
end

lib/channels/channel_defs/activity.rb

module Channels
  class Activity

    def current_user
      ApplicationController.current_controller.try(:current_or_guest_user)
    end

    def accessible?
      current_user.registered_user?
    end
  end
end

ApplicationController.current_controller是一个黑客,所以我们的演示者可以找到助手;我们在before_filter中将其设置为self。这当然不适用于控制台,我希望能够使用Channel.accessible?在控制台中,所以我尝试在.irbrc

中覆盖这样的方法
module Channels
  class Channel
    class << self
      puts "in irbrc"
      def current_user
        User.find(475)
      end
    end
  end
end

直接调用似乎有效:

ruby​​-1.9.2-p290:002&gt;频道:: Channel.current_user     =&GT; #

但是从通道本身调用时不是这样:

Channels::Channel.find_by_key(:activity).accessible?NoMethodError: undefined method `registered_user?' for nil:NilClass
    from /Users/jay/.rvm/gems/ruby-1.9.2-p290/gems/activesupport-3.0.9/lib/active_support/whiny_nil.rb:48:in `method_missing'
    from /Users/jay/src/tiptap/2t2/lib/channels/channel_defs/activity.rb:16:in `accessible?'
    from (irb):1

这可能是关于本征类与类的关系,或者是关于加载Channels :: Channel的时间。在我们重新开课之前,我已经尝试在.irbrc中添加require channels/channel,但是这样做没有...想法?

1 个答案:

答案 0 :(得分:0)

development模式下,模型类被定义为临时副本,并在reload!上重新定义,这可能会使此类扩展不可靠或无效。

最好将这种hackery分层作为某种配置选项。例如:

def current_user
  ENV['USER_ID'] ? User.find(ENV['USER_ID']) : ApplicationController.current_controller.try(:current_or_guest_user)
end

通过这种方式,您可以启动任何您想要的用户:

USER_ID=475 rails console