阅读清关源码时遇到的问题
Troubles when reading clearance source code
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
?为什么有道理?
No1:什么都没有。当您在空数组上调用该块时,该块将永远不会执行,因此不会分配值。这就像问 [].each { |item| puts item }
中的 item
是什么。这个想法是当它不为空时创建一个 guard classes 列表的对象。然后 guard_class
将指代每个单独的守卫 class.
No2:不能用显式接收者调用私有方法,即使是self
。但是这里session
调用的signed_in?
是Session#signed_in?
,不是SignInGuard#signed_in?
,是public所以没问题。
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
?为什么有道理?
No1:什么都没有。当您在空数组上调用该块时,该块将永远不会执行,因此不会分配值。这就像问 [].each { |item| puts item }
中的 item
是什么。这个想法是当它不为空时创建一个 guard classes 列表的对象。然后 guard_class
将指代每个单独的守卫 class.
No2:不能用显式接收者调用私有方法,即使是self
。但是这里session
调用的signed_in?
是Session#signed_in?
,不是SignInGuard#signed_in?
,是public所以没问题。