undefined local variable or method `password' for #<Class:0x007f978068b9f0>
Extracted source (around line #52):
end
def password.required?
super && provider.blank?
end
我正在关注如何实现OmniAuth this tutorial并完全复制他的代码......我想。我已经联系了视频所有者并且没有收到回复,并且在his website上发现了这个教程,看起来它实际上是在2012年制作的,而不是像YouTube视频发布日期所显示的那样。因此,我使用的代码可能与我安装的Ruby,Rails或Devise版本不兼容。 (我在过去一年中寻找使用Devise实现OmniAuth的教程的原因之一)。
为什么在第52行定义时,错误表明它是一个未定义的局部变量?它不会在该文件中的任何其他位置(用户模型)使用,而是在其他位置(登录页面和配置文件更新页面)。
Ruby:ruby 2.2.1p85(2015-02-26修订版49769)[x86_64-darwin14]
Rails:Rails 4.2.0
设计:3.4.1
用户模型:
## app/models/user.rb
01 class User < ActiveRecord::Base
02
03 devise :database_authenticatable, :registerable, :omniauthable,
04 :recoverable, :rememberable, :trackable, :validatable
05
06 validates :birthday, :presence => true
07 validates :user_name, :presence => true, :uniqueness => { :case_sensitive => false }
08
09 ################################################
10 ## Start section for User Name or Email Login ##
11 ################################################
12
13 attr_accessor :login
14
15 def self.find_for_database_authentication(warden_conditions)
16 conditions = warden_conditions.dup
17 if login = conditions.delete(:login)
18 where(conditions.to_h).where(["lower(user_name) = :value OR lower(email) = :value", { :value => login.downcase }]).first
19 else
20 where(conditions.to_h).first
21 end
22 end
23
24 ##############################################
25 ## End section for User Name or Email Login ##
26 ##############################################
27
28
29 ##############################################
30 ## Start section for OmniAuth Authorization ##
31 ##############################################
32
33 def self.from_omniauth(auth)
34 where(auth.slice(:provider, :uid)).first_or_create do |user|
35 user.provider = auth.provider
36 user.uid = auth.uid
37 user.user_name = auth.info.nickname
38 end
39 end
40
41 def self.new_with_session(params, session)
42 if session["devise.user_attributes"]
43 new(session["devise.user_attributes"], without_protection: true) do |user|
44 user.attributes = params
45 user.valid?
46 end
47 else
48 super
49 end
50 end
51
52 def password.required?
53 super && provider.blank?
54 end
55
56 def update_with_password(params, *options)
57 if encrypted_password.blank?
58 update_attributes(params, *options)
59 else
60 super
61 end
62 end
63
64 ############################################
65 ## End section for OmniAuth Authorization ##
66 ############################################
67 end
OmniAuth回调控制器(我不认为这是问题的一部分,但如果是,或者其他人需要代码):
## app/controllers/omniauth_callbacks_controller.rb
01 class OmniauthCallbacksController < Devise::OmniauthCallbacksController
02
03 def all
04 user = User.from_omniauth(request.env["omniauth.auth"])
05 if user.persisted?
06 flash.notice = "You have been logged in."
07 sign_in_and_redirect user, :event => :authentication
08 else
09 session["devise.user_attributes"] = user.attributes
10 redirect_to new_user_registration_url
11 end
12 end
13
14 alias_method :facebook, :all
15 alias_method :google, :all
16 alias_method :twitter, :all
17 alias_method :amazon, :all
18 alias_method :github, :all
19 end
提前感谢您的帮助。
答案 0 :(得分:4)
第52行有一个错字:
您应该使用:
def password_required?
而不是:
def password.required?