在会话控制器中,我尝试用.where(email:params [:email])替换“.find_by_email(params [:email])”,并使用Rails内置的has_secure_password验证密码失败。虽然前者起作用,但后者导致了一个被捕获的例外:
undefined method `authenticate' for #<ActiveRecord::Relation:0x0000010384e690>
这是控制器中不起作用的完整代码:
class SessionsController&lt; ApplicationController的 def new 端
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
端
答案 0 :(得分:1)
authenticate
是User
类的实例方法,但是where
在ActiveRecord :: Relation中返回这些对象的分类,而这些对象不知道这个方法。该代码以前使用find_by_email
方法,因为它返回单个User对象。要解决此问题,您可以更改此行:
user = User.where(email: params[:email])
为:
user = User.where(email: params[:email]).first
答案 1 :(得分:1)
你只需做一个很小的改变
user = User.where(email: params[:email]).first
As Cycle提到,你需要一个元素,而不是where where返回的数组。