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
?它为什么有意义?
答案 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
,这是公开的,所以很好。