我有一個存在於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
,但是這並不能實現...想法?