0

在会话控制器中,我尝试用 .where(email: params[:email]) 替换“.find_by_email(params[:email])”,并使用 Rails 内置的 has_secure_password 验证密码,但未成功。虽然前者有效,但后者导致捕获的异常:

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

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

类 SessionsController < ApplicationController def new end

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

结尾

4

2 回答 2

1

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

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

正如 Cyle 所提到的,您需要一个元素,而不是 where 返回的数组。

于 2013-02-21T19:26:09.353 回答
1

authenticateUser该类的实例方法,但是where在不知道该方法的 ActiveRecord::Relation 中返回这些对象的分类。该代码以前使用该find_by_email方法,因为它返回单个 User 对象。要修复,您可以更改此行:

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

至:

user = User.where(email: params[:email]).first
于 2013-02-21T19:23:25.020 回答