find_by_ *方法没有返回对象

时间:2013-06-09 15:50:21

标签: ruby-on-rails-3 authentication helper findby

我正在尝试为我的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

因此,当我尝试创建会话(登录)时,我将重定向到会话“新”模板。这是调试信息:

enter image description here

似乎没事。为什么以下声明无法找到记录:

  

SecurityUser.find_by_email(PARAMS [:电子邮件])

编辑:

当我在控制台中输入上面一行时,它返回记录:

enter image description here

1 个答案:

答案 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。