【问题标题】:undefined local variable or method `encrypted_password'未定义的局部变量或方法“encrypted_pa​​ssword”
【发布时间】:2013-06-20 14:42:27
【问题描述】:

我正在使用 devise 和 omniauth 允许用户通过 twitter 访问我的网站,注册工作正常,但是当我尝试登录(使用我刚刚注册的用户)时,我不断收到以下错误:

"未定义的局部变量或方法 `encrypted_pa​​ssword' for #"

问题是我的用户模型在任何地方都没有使用“encrypted_pa​​ssword”。 我正在使用 MongoDB 和 Mongoid。 完整跟踪:

C:/Ruby200-x64/lib/ruby/gems/2.0.0/bundler/gems/mongoid-fe7f43430580/lib/mongoid/attributes.rb:321:in `method_missing'
devise (3.0.0.rc) lib/devise/models/database_authenticatable.rb:118:in `authenticatable_salt'
devise (3.0.0.rc) lib/devise/models/authenticatable.rb:204:in `serialize_into_session'
devise (3.0.0.rc) lib/devise.rb:432:in `block (2 levels) in configure_warden!'
warden (1.2.1) lib/warden/session_serializer.rb:27:in `store'
warden (1.2.1) lib/warden/proxy.rb:175:in `set_user'
devise (3.0.0.rc) lib/devise/controllers/helpers.rb:135:in `sign_in'
devise (3.0.0.rc) lib/devise/controllers/helpers.rb:255:in `sign_in_and_redirect'
app/controllers/omniauth_callbacks_controller.rb:7:in `all'
actionpack (4.0.0.rc1) lib/action_controller/metal/implicit_render.rb:4:in `send_action'
actionpack (4.0.0.rc1) lib/abstract_controller/base.rb:189:in `process_action'
actionpack (4.0.0.rc1) lib/action_controller/metal/rendering.rb:10:in `process_action'
actionpack (4.0.0.rc1) lib/abstract_controller/callbacks.rb:18:in `block in process_action'
activesupport (4.0.0.rc1) lib/active_support/callbacks.rb:432:in `_run__1123313306__process_action__callbacks'
activesupport (4.0.0.rc1) lib/active_support/callbacks.rb:80:in `run_callbacks'
actionpack (4.0.0.rc1) lib/abstract_controller/callbacks.rb:17:in `process_action'
actionpack (4.0.0.rc1) lib/action_controller/metal/rescue.rb:29:in `process_action'
actionpack (4.0.0.rc1) lib/action_controller/metal/instrumentation.rb:31:in `block in process_action'
activesupport (4.0.0.rc1) lib/active_support/notifications.rb:159:in `block in instrument'
activesupport (4.0.0.rc1) lib/active_support/notifications/instrumenter.rb:20:in `instrument'
activesupport (4.0.0.rc1) lib/active_support/notifications.rb:159:in `instrument'
actionpack (4.0.0.rc1) lib/action_controller/metal/instrumentation.rb:30:in `process_action'
actionpack (4.0.0.rc1) lib/action_controller/metal/params_wrapper.rb:245:in `process_action'
actionpack (4.0.0.rc1) lib/abstract_controller/base.rb:136:in `process'
actionpack (4.0.0.rc1) lib/abstract_controller/rendering.rb:44:in `process'
actionpack (4.0.0.rc1) lib/action_controller/metal.rb:195:in `dispatch'
actionpack (4.0.0.rc1) lib/action_controller/metal/rack_delegation.rb:13:in `dispatch'
actionpack (4.0.0.rc1) lib/action_controller/metal.rb:231:in `block in action'
actionpack (4.0.0.rc1) lib/action_dispatch/routing/route_set.rb:80:in `call'
actionpack (4.0.0.rc1) lib/action_dispatch/routing/route_set.rb:80:in `dispatch'
actionpack (4.0.0.rc1) lib/action_dispatch/routing/route_set.rb:48:in `call'
actionpack (4.0.0.rc1) lib/action_dispatch/routing/mapper.rb:44:in `call'
actionpack (4.0.0.rc1) lib/action_dispatch/journey/router.rb:71:in `block in call'
actionpack (4.0.0.rc1) lib/action_dispatch/journey/router.rb:59:in `each'
actionpack (4.0.0.rc1) lib/action_dispatch/journey/router.rb:59:in `call'
actionpack (4.0.0.rc1) lib/action_dispatch/routing/route_set.rb:654:in `call'
omniauth (1.1.4) lib/omniauth/strategy.rb:401:in `call_app!'
omniauth (1.1.4) lib/omniauth/strategy.rb:363:in `callback_phase'
omniauth-oauth (1.0.1) lib/omniauth/strategies/oauth.rb:58:in `callback_phase'
omniauth (1.1.4) lib/omniauth/strategy.rb:226:in `callback_call'
omniauth (1.1.4) lib/omniauth/strategy.rb:182:in `call!'
omniauth (1.1.4) lib/omniauth/strategy.rb:164:in `call'
C:/Ruby200-x64/lib/ruby/gems/2.0.0/bundler/gems/mongoid-fe7f43430580/lib/rack/mongoid/middleware/identity_map.rb:34:in `block in call'
C:/Ruby200-x64/lib/ruby/gems/2.0.0/bundler/gems/mongoid-fe7f43430580/lib/mongoid/unit_of_work.rb:39:in `unit_of_work'
C:/Ruby200-x64/lib/ruby/gems/2.0.0/bundler/gems/mongoid-fe7f43430580/lib/rack/mongoid/middleware/identity_map.rb:34:in `call'
warden (1.2.1) lib/warden/manager.rb:35:in `block in call'
warden (1.2.1) lib/warden/manager.rb:34:in `catch'
warden (1.2.1) lib/warden/manager.rb:34:in `call'
rack (1.5.2) lib/rack/etag.rb:23:in `call'
rack (1.5.2) lib/rack/conditionalget.rb:25:in `call'
rack (1.5.2) lib/rack/head.rb:11:in `call'
actionpack (4.0.0.rc1) lib/action_dispatch/middleware/params_parser.rb:27:in `call'
actionpack (4.0.0.rc1) lib/action_dispatch/middleware/flash.rb:241:in `call'
rack (1.5.2) lib/rack/session/abstract/id.rb:225:in `context'
rack (1.5.2) lib/rack/session/abstract/id.rb:220:in `call'
actionpack (4.0.0.rc1) lib/action_dispatch/middleware/cookies.rb:486:in `call'
actionpack (4.0.0.rc1) lib/action_dispatch/middleware/callbacks.rb:29:in `block in call'
activesupport (4.0.0.rc1) lib/active_support/callbacks.rb:392:in `_run__1368160554__call__callbacks'
activesupport (4.0.0.rc1) lib/active_support/callbacks.rb:80:in `run_callbacks'
actionpack (4.0.0.rc1) lib/action_dispatch/middleware/callbacks.rb:27:in `call'
actionpack (4.0.0.rc1) lib/action_dispatch/middleware/reloader.rb:64:in `call'
actionpack (4.0.0.rc1) lib/action_dispatch/middleware/remote_ip.rb:76:in `call'
actionpack (4.0.0.rc1) lib/action_dispatch/middleware/debug_exceptions.rb:17:in `call'
actionpack (4.0.0.rc1) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
railties (4.0.0.rc1) lib/rails/rack/logger.rb:38:in `call_app'
railties (4.0.0.rc1) lib/rails/rack/logger.rb:21:in `block in call'
activesupport (4.0.0.rc1) lib/active_support/tagged_logging.rb:67:in `block in tagged'
activesupport (4.0.0.rc1) lib/active_support/tagged_logging.rb:25:in `tagged'
activesupport (4.0.0.rc1) lib/active_support/tagged_logging.rb:67:in `tagged'
railties (4.0.0.rc1) lib/rails/rack/logger.rb:21:in `call'
actionpack (4.0.0.rc1) lib/action_dispatch/middleware/request_id.rb:21:in `call'
rack (1.5.2) lib/rack/methodoverride.rb:21:in `call'
rack (1.5.2) lib/rack/runtime.rb:17:in `call'
activesupport (4.0.0.rc1) lib/active_support/cache/strategy/local_cache.rb:83:in `call'
rack (1.5.2) lib/rack/lock.rb:17:in `call'
actionpack (4.0.0.rc1) lib/action_dispatch/middleware/static.rb:64:in `call'
railties (4.0.0.rc1) lib/rails/engine.rb:511:in `call'
railties (4.0.0.rc1) lib/rails/application.rb:96:in `call'
rack (1.5.2) lib/rack/lock.rb:17:in `call'
rack (1.5.2) lib/rack/content_length.rb:14:in `call'
rack (1.5.2) lib/rack/handler/webrick.rb:60:in `service'
C:/Ruby200-x64/lib/ruby/2.0.0/webrick/httpserver.rb:138:in `service'
C:/Ruby200-x64/lib/ruby/2.0.0/webrick/httpserver.rb:94:in `run'
C:/Ruby200-x64/lib/ruby/2.0.0/webrick/server.rb:295:in `block in start_thread'

【问题讨论】:

  • 设计使用它。你运行迁移了吗?
  • 我正在使用 MongoDB 和 Mongoid。

标签: ruby-on-rails devise twitter omniauth ruby-2.0


【解决方案1】:

因为您使用的是 mongoid ORM,您需要在模型中显式定义字段。我给了你一个字段列表,顶部有注释,指定了与之配套的设计模块。您需要根据您使用的设计模块复制字段:

  ## Database authenticatable
  field :email,              :type => String, :default => ""
  field :encrypted_password, :type => String, :default => ""

  ## Password Expirable
  field :password_changed_at, :type => Time

  ## Recoverable
  field :reset_password_token,   :type => String
  field :reset_password_sent_at, :type => Time

  ## Rememberable
  field :remember_created_at, :type => Time

  ## Trackable
  field :sign_in_count,      :type => Integer, :default => 0
  field :current_sign_in_at, :type => Time
  field :last_sign_in_at,    :type => Time
  field :current_sign_in_ip, :type => String
  field :last_sign_in_ip,    :type => String

  ## Encryptable
  field :password_salt, :type => String

  ## Confirmable
  field :confirmation_token,   :type => String
  field :confirmed_at,         :type => Time
  field :confirmation_sent_at, :type => Time
  field :unconfirmed_email,    :type => String # Only if using reconfirmable
  field :deactivated,          :type => Boolean, :default => false
  field :status,               :type => String, :default => Status::PENDING

  ## Lockable
  field :failed_attempts, :type => Integer, :default => 0 # Only if lock strategy is :failed_attempts
  field :unlock_token,    :type => String # Only if unlock strategy is :email or :both
  field :locked_at,       :type => Time

  ## Token authenticatable
  field :authentication_token, :type => String

  ## Invitable
  field :invitation_token, :type => String
  field :invitation_sent_at, :type => Time
  field :invitation_accepted_at, :type => Time
  field :invitation_limit, :type => Integer, :default => 0
  field :invited_by_id, :type => String
  field :invited_by_type, :type => String

【讨论】:

  • 我正在使用omniauth 并一起设计。设计正常登录和omniauth,以便我可以进行第3方登录(推特、脸书等)
  • 你需要添加database_authenticable迁移。它将加密密码添加到数据库。 t.database_authenticatable :null => false
  • 我正在使用 MongoDB 和 Mongoid
  • 我根据你给我的信息更新了答案。我没有在您的问题中看到 MongoDB 部分。对不起
  • 我在使用 MongoDB @Mulaiko 时遇到了同样的问题,您发现了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-26
  • 2018-04-19
  • 2015-01-01
相关资源
最近更新 更多