【问题标题】:Devise `find_first_by_auth_conditions` method explanation设计`find_first_by_auth_conditions`方法说明
【发布时间】:2014-04-14 13:15:29
【问题描述】:

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

【问题讨论】:

标签: ruby-on-rails ruby activerecord devise


【解决方案1】:

以下回答问题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) 将新变量 signin 赋值为 :signin 来自 Hash 的密钥对 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

【讨论】:

    【解决方案2】:
    1. 这会从conditions 哈希中删除signin 键并将其值分配给login 局部变量。

    【讨论】:

      【解决方案3】:

      2.. 我猜你的意思是signin 没有在find_first_by_auth_conditions 中定义?那我也猜signinwarden_conditions的一个属性所以你可以试试:warden_conditions.signin

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-02
        • 1970-01-01
        • 2020-10-31
        • 2013-11-10
        • 2011-12-24
        • 2013-09-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多