阅读清关源代码时遇到麻烦

时间:2015-07-06 17:16:36

标签: ruby private inject clearance

def initialize_sign_in_guard_stack
  default_guard = DefaultSignInGuard.new(self)    
  guards = Clearance.configuration.sign_in_guards 

  guards.inject(default_guard) do |stack, guard_class|
    guard_class.new(self, stack)         
  end
end

class DefaultSignInGuard < SignInGuard
  def call
    if session.signed_in?
      success
    else
      failure default_failure_message.html_safe
    end
 end
end

class SignInGuard
  def initialize(session, stack = [])
    @session = session
    @stack = stack
  end
private
attr_reader :stack, :session

def signed_in?
  session.signed_in?
end

def current_user
  session.current_user
end
end

Pry(main)> Clearance.configuration.sign_in_guards # => []

没有。 1

由于守卫是一个空数组,所以guard_class指的是什么? 它怎么能运行新方法?你能解释一下这行代码的作用吗?

没有。 2

signed_in?是SignInGuard的私有方法。我知道只有“self”可以 叫它。在这里,session.signed_in?它为什么有意义?

1 个答案:

答案 0 :(得分:1)

No1:什么都没有。当您在空数组上调用它时,该块将永远不会执行,因此不会分配值。这就像在item中询问[].each { |item| puts item }是什么。这个想法是当它不是空的时候创建一个保护类列表的对象。然后guard_class将引用每个单独的警卫班。

No2:即使是self,您也无法使用显式接收器调用私有方法。但是,signed_in?session Session#signed_in? SignInGuard#signed_in? SELECT * FROM table1, table2 WHERE table1.ref=table2.ref; 而非is-open,这是公开的,所以很好。