ruby - Rails - 未定义的方法 `authenticate'

标签 ruby ruby-on-rails-3 authentication activerecord

我在尝试对用户进行身份验证时收到以下错误。

NoMethodError (undefined method验证'#)`

当我从 Rails 控制台执行命令时,user.authenticate('password') 成功(即返回用户对象)。

irb(main):008:0> user.authenticate("sanket")
=> #<User id: 2, name: "Sanket", email: "sanket.meghani@infibeam.net", created_at: "2014-02-14 08:58:28", updated_at: "2014-02-14 08:58:28", password_digest: "$2a$10$KNuBgvqVDIErf3a24lMcaeNt1Hyg0I8oreIQSEYsXY4T...", remember_token: "3b64273a4fcced7c8bf91f7f7490e60a5919658d">

但是,当我将 user.authenticate 放入辅助类中并使用 url 访问它时,它会显示

undefined method 'authenticate' for #<ActiveRecord::Relation:0x007fd9506dce38>

我正在关注 Rails Tutorial

我的用户模型是这样的:

class User < ActiveRecord::Base        
    attr_accessible :email, :name, :password, :password_confirmation
    has_secure_password

    .
    .
    .
end

session_helper.rb 中的相关方法如下:

def create
    user = User.where(:email => params[:session][:email].downcase)

    if user && user.authenticate(params[:session][:password])
        sign_in user
        redirect_to user
    else
        flash.now[:error] = 'Invalid email/password combination'
        render "new"
    end
end

它在 if user && user.authenticate(params[:session][:password]) 上给出了上述错误行。

令我惊讶的是,它在 rails 控制台上运行,但同样的调用在 rails 服务器上不起作用。

最佳答案

正如您在错误中看到的那样,where 返回一个关系,而不是单个对象。

查看相关问题:Why does a single record lookup return an array? (Rails beginner)

在您的情况下,您可以将 first 添加到方法链的末尾,这样它将返回此关系的第一个元素:

user = User.where(:email => params[:session][:email].downcase).first

关于ruby - Rails - 未定义的方法 `authenticate',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21794660/

相关文章:

css - 使用 rake 任务从 Sass 生成 CSS 并写入文件

ruby-on-rails - 如何使用 rails 和 postgresql 将匹配记录保存为新记录并更新 user_id

ruby-on-rails-3 - EPIC EMR 的任何可用 API?

java - 使用接收到的访问 token 检索 Keycloak 用户数据

authentication - Grails 应用程序中的安全性 : Acegi or Shiro

ruby - Typhoeus Windows 安装

ruby - 如何循环数字+过去X年的月份和日期?

ruby-on-rails - 减少 Rails 路由和 url 助手中的冗余

ruby-on-rails - 在 session 中临时存储回形针对象

dropbox - 如何在不离开网页的情况下对 Dropbox 应用进行身份验证并使用 API?