2011-09-29 40 views
0

我有一個存在於lib中的演示者的Rails 3應用程序。相關的部分看起來像:在.irbrc中重載Rails模塊的類方法

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 

而且似乎在工作的時候直接調用:

紅寶石1.9.2-P290:002>頻道:: Channel.current_user =>#

但不是從一個渠道本身調用時:

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 

這可能是要麼講講eigenclass VS的CL屁股,或關於加載Channels :: Channel的時機。在我們重新打開課程之前,我試過在.irbrc中添加一個require channels/channel,但是這並不能實現...想法?

回答

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