我的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验证器更简洁吗?
答案 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
我不确定这是否会显示您提到的所有错误,但如果电子邮件或密码是空白/不正确,则应该明确显示。