麻烦时阅读清除源代码


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 ?为什么说得通呢?

no: To nothing。当你在一个空数组上调用该块时,它将永远不会执行,因此不会赋值。这就像问[].each { |item| puts item }中的item是什么。这个想法是,当它不是空的时候,创建一个保护类列表的对象。那么guard_class将指代每个单独的守卫等级。

No2:你不能用显式接收器调用私有方法,即使它是self。然而,这里signed_in?调用sessionSession#signed_in?,而不是SignInGuard#signed_in?,这是公开的,所以它是好的。

相关内容

  • 没有找到相关文章

最新更新