验证Rails登录

时间:2016-12-13 15:25:35

标签: ruby-on-rails ruby validation

我的Rails应用程序中有一个SessionsController,如下所示:

class SessionsController < ApplicationController

  def new
    if @current_user.present?
      redirect_to dashboard_path
    else
      @title = 'Log in'
      render :layout => 'other'
    end
  end

  def create
    user = User.find_by_email(params[:session][:email])
    if user && user.authenticate(params[:session][:password])
      session[:user_id] = user.id
      redirect_to params[:redirect_url].present? ? view_context.b64_decode(params[:redirect_url]) : '/admin/dashboard'
    else
      redirect_to login_path(params[:redirect_url].present? ? {:redirect_url => params[:redirect_url]} : {}), :alert => 'Invalid credentials'
    end
  end

end

所以基本上有两种方法,一种用于显示登录表单,另一种用于处理检查凭据的post请求。成功时,创建会话并重定向,或者出错时,使用警报重定向登录表单。

但是,我想使用Rails验证来提供有关问题的更多信息,例如:电子邮件或密码空白,电子邮件或密码组合不正确,锁定用户等

我无法创建模型,因为我没有名为Sessions的数据库表,因此我不想使用它...如何使用Rails验证来验证这样的形式?

我能想到的唯一方法就是创建一个类似的方法,然后从控制器中调用它。

def check_login
  if params[:session][:email].blank? && params[:session][:password].present?
    redirect('Email address missing')
  elsif params[:session][:email].present? && params[:session][:password].blank?
    redirect('Password missing')
  elsif params[:session][:email].blank? && params[:session][:password].blank?
    redirect('Email address and password missing')
  else
    user = User.where(email: params[:session][:email]).first
    if user.present?
      if user.authenticate(params[:session][:password])
        session[:user_id] = user.id
        redirect_to params[:redirect_url].present? ? view_context.b64_decode(params[:redirect_url]) : '/admin/dashboard'
      else
        redirect('Incorrect email/password combo')
      end
    else
      redirect('Unknown user')
    end
  end
end

def redirect(alert)
  redirect_to login_path(params[:redirect_url].present? ? {:redirect_url => params[:redirect_url]} : {}), :alert => alert
end

然后我的控制器方法就是:

  def create
    @session = check_login
  end

但是他们使用Rails验证器更简洁吗?

1 个答案:

答案 0 :(得分:0)

您可以只渲染:new,而不是重定向回login_path。 E.g。

var carUpdate = ServiceProxy.Create<ICarUpdate>(new Uri("fabric:/App/Car"));
await carUpdate.ProcessCarUpdate();

如果您使用simple_form_for登录,那么您可以添加此行以显示表单上的错误:

def create
  user = User.find_by_email(params[:session][:email])
  if user && user.authenticate(params[:session][:password])
    session[:user_id] = user.id
    redirect_to params[:redirect_url].present? ? view_context.b64_decode(params[:redirect_url]) : '/admin/dashboard'
  else
    render :new
  end
end

我不确定这是否会显示您提到的所有错误,但如果电子邮件或密码是空白/不正确,则应该明确显示。