我使用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
答案 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)
signin
哈希中删除conditions
密钥,并将其值分配给login
局部变量。 答案 2 :(得分:0)
2 ..我想你的意思是signin
中没有定义find_first_by_auth_conditions
?然后我还猜测signin
是warden_conditions
的属性,因此您可以尝试:warden_conditions.signin
。