我在尝试验证用户时收到以下错误。
NoMethodError (undefined method
验证'for#)`
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">
但是,当我将user.authenticate放在帮助器类中并使用url访问它时,它说
undefined method 'authenticate' for #<ActiveRecord::Relation:0x007fd9506dce38>
我正在关注Rails Tutorial
我的用户模型如下:
class User < ActiveRecord::Base
attr_accessible :email, :name, :password, :password_confirmation
has_secure_password
.
.
.
end
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
它在if user && user.authenticate(params[:session][:password])
行上给出了上述错误。
让我感到惊讶的是,它正在使用rails控制台,但同样的调用无法从rails服务器上运行。
答案 0 :(得分:11)
正如您在错误中看到的那样,where
会返回一个关系,而不是一个对象。
检查相关问题:Why does a single record lookup return an array? (Rails beginner)
在您的情况下,您可以将first
添加到方法链的末尾,这样它将返回此关系的第一个元素:
user = User.where(:email => params[:session][:email].downcase).first