zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    zstu.4189: 逻辑运算(构建 && 前缀表达式入门)
    Oulipo (kmp)
    zstu.4194: 字符串匹配(kmp入门题&& 心得)
    杭赛.Triangle(数学推导)
    cf.VK CUP 2015.C.Name Quest(贪心)
    微服务技术栈
    luogu3320 寻宝游戏 (dfs序+倍增lca+set)
    cf757F Team Rocket Rises Again (dijkstra+支配树)
    cf983E NN Country (倍增+dfs序+树状数组)
    cf860E Arkady and A Nobody-men (树剖)
  • 原文地址:https://www.cnblogs.com/FBsharl/p/11478282.html
Copyright © 2011-2022 走看看