未定义的局部变量或方法`password'

时间:2015-07-14 04:13:20

标签: ruby-on-rails ruby devise omniauth

错误消息

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

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

第52行有一个错字:

您应该使用:

def password_required?

而不是:

def password.required?