Rails - 未定义的方法`authenticate'

San*_*ani 3 ruby authentication activerecord ruby-on-rails-3

我在尝试验证用户时收到以下错误.

NoMethodError (undefined method验证'for#)`

当我从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">
Run Code Online (Sandbox Code Playgroud)

但是,当我将user.authenticate放在帮助器类中,并使用url访问它时,它说

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

我正在关注Rails教程

我的用户模型如下:

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

    .
    .
    .
end
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

它在线提供上述错误if user && user.authenticate(params[:session][:password]).

让我感到惊讶的是,它是从rails控制台运行的,但同样的调用无法从rails服务器运行.

Mik*_*Mik 11

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

检查相关问题:为什么单个记录查找返回一个数组?(Rails初学者)

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

user = User.where(:email => params[:session][:email].downcase).first
Run Code Online (Sandbox Code Playgroud)