设计`find_first_by_auth_conditions`方法说明

时间:2014-04-14 13:15:29

标签: ruby-on-rails ruby activerecord devise

我使用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

3 个答案:

答案 0 :(得分:1)

以下回答问题1) - 具体为A)B)。以下代码是一个示例,并不反映Devise生成的实际方法或参数:

此处:Hash包含:signin键值对和其他有效ActiveRecord的{​​{1}}语法 http://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-where

#where

这会复制原始参数以防止修改,以便在后续方法或查询中使用它 http://ruby-doc.org/core-1.9.3/Object.html#method-i-dup

devise_conditions = {:signin => "cool@gmail.com", :deleted => false, :role => 'basic'} 
#=> {:signin=>"cool@gmail.com", :deleted => false, :role => 'basic'} 

此处,代码: A)会从conditions = devise_conditions.dup #=> {:signin=>"cool@gmail.com", :deleted => false, :role => 'basic'} 删除:signin密钥对。和 B)Hash分配值为signin密钥对的新变量:signin http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-delete

Hash

可以重写上面的代码,以使用额外的"元素参考"来澄清这两个操作。 signin = conditions.delete(:signin) #=> "cool@gmail.com" http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-5B-5D

Hash

使用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'}

Method1 不会创建变量2)signin来自创建它的代码被删除时没有创建undefined local variable or method signin变量的结果。

方法2 会创建一个变量signin,该变量的值login的原始Hash的值为conditions

答案 1 :(得分:0)

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

答案 2 :(得分:0)

2 ..我想你的意思是signin中没有定义find_first_by_auth_conditions?然后我还猜测signinwarden_conditions的属性,因此您可以尝试:warden_conditions.signin