2013-02-21 21 views
0

在会话控制器中,我试图用.where(email:params [:email])替换“.find_by_email(params [:email])”,并验证Rails内置has_secure_password密码。虽然以前的作品,后者导致捕获的异常:无法使用.where查询替换动态查找程序

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

这是控制器的完整代码不起作用:

类SessionsController < ApplicationController的 高清新 结束

def create 
    user = User.where(email: params[:email]) 
    if user && user.authenticate(params[:password]) 
    session[:user_id] = user.id 
    redirect_to texts_path, notice: "Logged in!" 
    else 
    render "new" 
    end 
end 

end

回答

1

authenticate是一个实例方法的User类,但是where在不知道此方法的ActiveRecord :: Relation内返回这些对象的分类。该代码以前与find_by_email方法一起使用,因为它会返回单个用户对象。要解决,你可以改变这一行:

user = User.where(email: params[:email]) 

到:

user = User.where(email: params[:email]).first 
1

你只需要做一个很小的变化

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

正如Cyle提到的,你需要一个单一的元素,不是由数组返回的数组。