Ruby on Rails Tutorial 第八章笔记 基本登陆功能

 在本章实现用户登陆与退出功能.

由于 HTTP 是一种无状态协议,本质上来说,用户是无法在两个页面上保持登陆状态的.
为了解决这个问题,解决方案是通过浏览器的 cookie 数据库实现用户与服务器的半永久连接,这样的连接称为 session (会话)
从 Rails 的角度看, session 的本质,或当作一种可实现 REST 架构的资源,但与 User 不同的是,其不是 model,并不储存在数据库中,而是储存在 cookie 中的 REST 资源,其类比如下:

  • 用户打开登陆页面,即相当于 show 相应页面
  • 用户登陆的过程,就是 create 会话的过程
  • 用户退出的过程,就是 destroy 会话的过程.

因此,本着这种基本思想,本章分为两大部分:

  1. 首先创建了 Session 这一控制器,并实现其 REST 架构;(与第七章——”用户注册“很相似)
  2. 然后在此基础之上,实现用户登陆后在用户页面的一些交互.

☝️ 路由规则 & Sessions 控制器

路由规则:

对比: 在 User 模型中,通过 REST 路由: resources: :user 添加全部路由,关联全部动作

Session 路由:
由于 Session 不是模型,因此需要自定义其 HTTP 请求动作、路由(以及具名路由)、与控制器关联的动作,即制作路由规则表.

制作路由规则表:


制作好路由规则表之后,应该在 config/routes.rb 中添加代码如下:

get '/login',  to: 'session#new'
post '/login', to: 'session#create'
delete '/logout', to: ‘session#destroy'

 

动作规则

首先创建控制器,:
命令: rails generate controller Sessions new
功能:

  1. 会生成 new 动作的界面,因此执行 rails generate 时添加需要有页面的动作的动作名,在这里是 new 动作
  2. 生成 Sessions 控制器
  3. 生成 session_helper 文件

☝️ 登陆页面——new.html.erb

对比:在 User 模型中,使用 form_for(@user) do .. end, 该代码将 form 中的 params 散列传递给数据库.

Session 表单:
由于 Session 并不是一个模型,因此不能创建 @user 变量,在 form_for 中需要多提供一些信息,代码如下:
form_for(:session, url, login_path)
其中,

  1. 第一个参数为资源的名称
  2. 第二个参数为提交表单的相应的 URL

用户提交数据之后,会得到一个 params 散列,其中

  • params[:session][:email] 储存用户 email
  • params[:session][:password] 储存用户 password

这些散列数据可供以后数据验证,用户确认等操作使用.

create 动作——创建会话

首先,应该处理用户登陆失效的情况.
对比:在 User 模型用户注册一章, 验证代码为 if @user.save ,其对用户数据进行的验证是自动通过 Model 模型的 Active Record 功能实现的.

Session 数据验证:
由于Session 不是模型,因此没有 Active record 的支持,因此需要自定义错误消息,利用 flash 闪现消息来提示用户出错.
判断条件为:

user = User.find_by(email: params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])

渲染闪现消息: 
else flash[:danger] = "Invalid email/password combination'

✌️ 登陆交互

基本思想:
作者通过在 session_helper.rb 文件中添加一系列动作,作为判断的条件,或用于返回对象, 由于 session_helper 是属于 module SessionHelper 的,其全部方法自动引入 Rails 视图,同时为了也能在控制器中使用,可在 application_controller.rb 中引入 SessionHelper 模块,代码如下:
include SessionHelper

session 方法创建 cookie

Rails 有 session 方法,其用于将用户的数据来创建一个临时的,安全的 cookie.
代码为: session[:user_id] = user.id

posted @ 2019-09-06 21:10  FBshark  阅读(191)  评论(0编辑  收藏  举报