0
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号

既然guards是一个空数组,那么guard_class指的是什么?它如何运行新方法?你能解释一下这行代码是做什么的吗?

2号

signed_in? 是 的私有方法SignInGuard。我知道只有' self'才能调用它。在这里,session.signed_in?为什么有意义?

4

1 回答 1

1

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

No2:您不能使用显式接收器调用私有方法,即使它是self. 但是,这里signed_in?调用的sessionSession#signed_in?,不是SignInGuard#signed_in?,这是公开的,所以没关系。

于 2015-07-06T17:28:34.127 回答