没有会话模型。除了显示一般失败通知之外,如何创建有关表单提交失败原因的特定错误?
回想一下第 7.3.3 节,我们使用用户模型错误消息显示注册错误。这些错误与特定的 Active Record 对象相关,但此策略在这里不起作用,因为会话不是 Active Record 模型。相反,我们将在闪存中放置一条消息,以便在登录失败时显示。导轨教程 https://www.railstutorial.org/book/basic_login
控制器
class SessionsController < ApplicationController
def new
end
def create
user = User.find_by(email: params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])
if user.activated?
log_in user
params[:session][:remember_me] == '1' ? remember(user) : forget(user)
redirect_back_or user
else
message = "Account not activated. "
message += "Check your email for the activation link."
flash[:warning] = message
redirect_to root_url
end
else
flash.now[:danger] = 'Invalid email/password combination'
render 'new'
end
end
Form
<%= form_for(:session, url: login_path) do |f| %>
<%= f.label :email %>
<%= f.email_field :email, class: 'form-control' %>
<%= f.label :password %>
<%= f.password_field :password, class: 'form-control' %>
<%= f.submit "Sign in", class: "btn btn-primary sessions" %>
<% end %>
参数传递如下:
于 2016-09-06 17:33:59 +0000 于 68.204.49.62 开始发布“/login”
2016-09-06T17:33:59.165393 + 00:00应用程序[web.1]:参数:{“utf8”=>“✓”,“authenticity_token”=>“DhKuJCjbeVgBOsQiujgd34540Vk3i5ouRFpAm8JnU9ZKWlMZhxN7VPnWJrfuuKmg FNTvsDfJNTXNLRpI1pHNebA==", "会话"=>{"电子邮件“=>”[电子邮件受保护] /cdn-cgi/l/email-protection", "密码"=>"[已过滤]", "remember_me"=>"0"}, "提交"=>"登录"}
编辑:所以我想到这样做?
def create
user = User.find_by(email: params[:session][:email].downcase)
if user
if user.authenticate(params[:session][:password])
if user.activated?
log_in user
params[:session][:remember_me] == '1' ? remember(user) : forget(user)
flash.now[:success] = "Great job dude!"
redirect_back_or user
elsif !user.activated?
message = "Account not activated. "
message += "Check your email for the activation link."
flash[:warning] = message
redirect_to root_url
else
flash.now[:danger] = "Something went wrong, please try again."
render 'new'
end
elsif !user.authenticate(params[:session][:password])
flash.now[:danger] = "Incorrect password."
render 'new'
else
flash.now[:danger] = "Something went wrong. Please try again."
render 'new'
end
elsif !user
flash.now[:danger] = 'Incorrect email'
render 'new'
else
flash.now[:danger] = "Something went wrong, please try again or contact support."
render 'new'
end
end
这可以通过尝试/错误测试来实现,但看起来并不理想/干燥。