【问题标题】:find_by_* method is not returning the objectfind_by_* 方法没有返回对象
【发布时间】:2013-06-09 15:50:21
【问题描述】:

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

编辑:

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

【问题讨论】:

  • 你遇到了什么错误?
  • @Rinku 我没有收到任何错误 - 助手 (find_by_email) 无法找到用户,因此无法创建会话。
  • 你用 Rails 控制台检查过吗?你能到那里吗?
  • @Rinku 是的,我已经更新了问题 - 该方法在那里有效。
  • 您是否正确收到了参数中的电子邮件?您检查过吗?

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


【解决方案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。

【讨论】:

  • 是的,是 [:session][:email] - 导致了问题。我没有使用像 Devise 这样的现成解决方案来运行如何自己制作这些东西。为什么我需要将其移动到我的模型中,而不是使用“身份验证”方法。此外,密码不保存为纯文本 - 我使用的是 bcrypt。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-16
  • 1970-01-01
  • 2014-03-29
  • 1970-01-01
  • 2012-09-12
  • 2017-10-16
  • 2021-03-12
相关资源
最近更新 更多