2011-09-29 12 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 

これはおそらく、CL対eigenclassについて何かのどちらかでありますお尻、またはチャンネルの読み込みのタイミングについて何か::チャンネル。クラスを再び開く前に、私はrequire channels/channelを.irbrcに追加しようとしましたが、それはできません...アイデア?

答えて

0

モードでは、モデルクラスはテンポラリコピーとして定義され、reload!に再定義されます。これにより、このような拡張子が信頼できないか、無効になる可能性があります。

この種のハッカーをある種の設定オプションとしてレイヤーする方がよいでしょう。

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 
関連する問題