设计`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 

我的问题:

  1. 这段代码执行什么/做什么? login = conditions.delete(:signin)
  2. 如果没有上面的代码,我会得到一个错误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不会创建变量signinundefined local variable or method signin是在删除创建它的代码时没有创建signin变量的结果。

Method2创建一个变量login ,它具有来自原始Hash命名conditions的值,其键为:signin

  1. 这会从conditions哈希中删除signin密钥,并将其值分配给login本地变量。

2 ..我想你的意思是在find_first_by_auth_conditions没有定义find_first_by_auth_conditions ? 然后我还猜测warden_conditionswarden_conditions一个属性,所以你可以尝试: warden_conditions.signin