无法用.where查询替换动态查找器

时间:2013-02-21 19:13:08

标签: ruby-on-rails rails-activerecord

在会话控制器中,我尝试用.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

2 个答案:

答案 0 :(得分:1)

authenticateUser类的实例方法,但是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返回的数组。