在本章实现用户登陆与退出功能.
由于 HTTP 是一种无状态协议,本质上来说,用户是无法在两个页面上保持登陆状态的.
为了解决这个问题,解决方案是通过浏览器的 cookie 数据库实现用户与服务器的半永久连接,这样的连接称为 session (会话).
从 Rails 的角度看, session 的本质,或当作一种可实现 REST 架构的资源,但与 User 不同的是,其不是 model,并不储存在数据库中,而是储存在 cookie 中的 REST 资源,其类比如下:
因此,本着这种基本思想,本章分为两大部分:
对比: 在 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
功能:
对比:在 User 模型中,使用 form_for(@user) do .. end, 该代码将 form 中的 params 散列传递给数据库.
Session 表单:
由于 Session 并不是一个模型,因此不能创建 @user 变量,在 form_for 中需要多提供一些信息,代码如下:form_for(:session, url, login_path)
其中,
用户提交数据之后,会得到一个 params 散列,其中
这些散列数据可供以后数据验证,用户确认等操作使用.
首先,应该处理用户登陆失效的情况.
对比:在 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
Rails 有 session 方法,其用于将用户的数据来创建一个临时的,安全的 cookie.
代码为: session[:user_id] = user.id
Ruby on Rails Tutorial 第八章笔记 基本登陆功能
原文:https://www.cnblogs.com/FBsharl/p/11478282.html