我正在尝试为我的rails应用程序设置一个简单的身份验证。我有一个security_users脚手架,并创建了一些用户。
当我尝试使用其中一些帐户登录时,会发现“find_by_ *”方法无法检测到当前帐户。
这就是我的会话控制器的样子(为了调试问题,我为了调试问题而对目的进行了密码检查):
class SessionsController < ApplicationController
def new
end
def create
@security_user = SecurityUser.find_by_email(params[:email])
if @security_user #&& @security_user.authenticate(params[:password])
session[:security_user_id] = @security_user.id
redirect_to root_url, notice: "Logged in!"
else
flash.now.alert = "Email or password is invalid"
render 'new'
end
end
def destroy
session[:user_id] = nil
redirect_to root_url, notice: "Logged out!"
end
end
因此,当我尝试创建会话(登录)时,我将重定向到会话“新”模板。这是调试信息:
似乎没事。为什么以下声明无法找到记录:
SecurityUser.find_by_email(PARAMS [:电子邮件])
编辑:
当我在控制台中输入上面一行时,它返回记录:
答案 0 :(得分:1)
首先,除非这是Rails身份验证中的一个简单练习,否则您应该在此阶段使用Devise或AuthLogic。
其次,您确定params [:email]包含您要查找的电子邮件吗?从你的参数来看,我觉得你想要使用params [:session] [:email]。
第三,你应该把它移到模型中。例如:
class SecurityUser < ActiveRecord::Base
def self.authenticate(params)
user = where(email: params[:email]).first
(user && user.password == params[:password]) ? user : false
end
end
在控制器中:
@user = SecurityUser.authenticate params[:session]
session[:user_id] = user.id if @user
请注意,密码未经过哈希处理 - 您不应该保存纯文本密码 - 但这不是它的用途。
另请注意,现在您应该首先使用where()。而不是find_by。