0

我正在尝试为我的 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[:email])

编辑:

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

在此处输入图像描述

4

1 回答 1

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().first 而不是 find_by。

于 2013-06-09T17:24:03.343 回答