设计`find_first_by_auth_conditions`方法说明
我使用Devise的两种方法:
方法1
def self.find_first_by_auth_conditions(warden_conditions) conditions = warden_conditions.dup where(conditions).where(["lower(username) = :value OR lower(email) = :value", {:value => signin.downcase }]).first end
方法2
def self.find_for_database_authentication(warden_conditions) conditions = warden_conditions.dup login = conditions.delete(:signin) where(conditions).where(["lower(username) = :value OR lower(email) = :value", {:value => login.strip.downcase }]).first end
我的问题:
- 这段代码执行什么/做什么?
login = conditions.delete(:signin)
- 如果没有上面的代码,我会得到一个错误
undefined local variable or method signin
以下回答问题1)
– 特别是下面的A)
和B)
。 以下代码是一个示例,并不反映Devise生成的实际方法或参数:
这里: Hash
包含:signin
键值对和其他有效的ActiveRecord
的#where
语法http://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-where
devise_conditions = {:signin => "cool@gmail.com", :deleted => false, :role => 'basic'} #=> {:signin=>"cool@gmail.com", :deleted => false, :role => 'basic'}
这会复制原始参数以防止修改,以便在后续方法或查询中使用它http://ruby-doc.org/core-1.9.3/Object.html#method-i-dup
conditions = devise_conditions.dup #=> {:signin=>"cool@gmail.com", :deleted => false, :role => 'basic'}
这里,代码: A)从Hash
删除:signin
密钥对; 和B)从Hash
分配值为:signin
key-pair的新变量signin
http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-delete
signin = conditions.delete(:signin) #=> "cool@gmail.com"
可以使用Hash
附加“元素参考”来重写上面的代码以澄清这两个操作http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-5B-5D
signin = conditions[:signin] #=> "cool@gmail.com" conditions.delete(:signin) #=> "cool@gmail.com" # deleted value from Hash is returned conditions #=> {:deleted => false, :role => 'basic'}
使用dup
保留了方法的原始参数
devise_conditions #=> {:signin=>"cool@gmail.com", :deleted => false, :role => 'basic'}
以下回答问题2)
:
Method1不会创建变量signin 。 undefined local variable or method signin
是在删除创建它的代码时没有创建signin
变量的结果。
Method2创建一个变量login
,它具有来自原始Hash
命名conditions
的值,其键为:signin
。
- 这会从
conditions
哈希中删除signin
密钥,并将其值分配给login
本地变量。
2 ..我想你的意思是在find_first_by_auth_conditions
没有定义find_first_by_auth_conditions
? 然后我还猜测warden_conditions
是warden_conditions
一个属性,所以你可以尝试: warden_conditions.signin
。