Rails的会话介绍和用法

本文概述

  • 进入会话
  • 会话示例
Rails会话仅在控制器或视图中可用, 并且可以使用不同的存储机制。在这里可以存储来自第一个请求的数据, 该数据可以从以后的请求中读取。
以下是Rails中会话的一些存储机制:
  • ActionDispatch :: Session :: CookieStore-将所有内容存储在客户端上。
  • ActionDispatch :: Session :: CacheStore-将数据存储在Rails缓存中。
  • ActionDispatch :: Session :: ActiveRecordStore-使用Active Record将数据存储在数据库中。
  • ActionDispatch :: Session :: MemCacheStore-将数据存储在memcached集群中
所有存储机制都使用cookie为每个会话存储唯一的ID。通常, 此ID在服务器上查找会话数据, 例如数据库表。有一个例外, 这是默认的推荐会话存储是CookieStore, 它将所有会话数据存储在cookie本身中。它非常轻巧, 需要在新应用程序中进行零设置才能使用会话。 cookie数据经过加密和加密签名, 以防篡改。
复杂对象不应存储在会话中, 因为服务器可能不会在请求之间重新组合它们, 这最终会导致错误。
进入会话 可以通过会话实例方法访问该会话。如果无法使用操作代码访问会话, 则不会加载它们。
会话值使用像哈希一样的键/值对存储。它们通常是32位字符长的字符串。
在Rails中, 可以使用会话方法保存和检索数据。
session[:user_id] = @current_user.id User.find(session[:user_id])

要在会话中存储数据, 请将其分配给密钥。
class LoginsController < ApplicationController # "Create" a login, aka "log the user in" def create if user = User.authenticate(params[:username], params[:password]) # Save the user ID in the session so it can be used in # subsequent requests session[:current_user_id] = user.id redirect_to root_url end end end

要从会话中删除数据, 请将该键分配为nil。
class LoginsController < ApplicationController # "Delete" a login, aka "log the user out" def destroy # Remove the user id from the session @_current_user = session[:current_user_id] = nil redirect_to root_url end end

要重置整个会话, 请使用reset_session。
会话示例 我们将使用会话创建一个简单的登录表单。用户登录后, 其凭据将被保存。只有登录的用户才能登录。你还可以查看所有登录的用户。
步骤1创建应用程序日志
rails new log

步骤2将目录更改为log
cd log

步骤3转到应用程序的Gemfile。激活行gem’ bcrypt’ 并停用文件中的行gem’ jbuilder’ 。
步骤4现在运行捆绑软件
bundle

步骤5创建一个控制器。
rails g controller Page index

步骤6更改config / routes.rb文件。
Rails.application.routes.draw do get 'page/index' root 'page#index' end

步骤7生成用户支架。
rails g scaffold User first_name last_name email password:digest

步骤8迁移数据库。
rake db:migrate

步骤9转到app / models / user.rb文件并编写以下代码。
class User < ActiveRecord::Base has_secure_password validates :first_name, presence: true validates :last_name, presence: true validates :email, presence: true, uniqueness: true, format: { with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2, })\z/i } def to_s "#{first_name} #{last_name}" end end

步骤10我们需要一种会话机制来创建登录和注销过程。
rails g controller sessions new create destroy

步骤11转到config / routes.rb文件并更改以下数据。
Rails.application.routes.draw do resources :sessions, only: [:new, :create, :destroy] get 'signup', to: 'users#new', as: 'signup' get 'login', to: 'sessions#new', as: 'login' get 'logout', to: 'sessions#destroy', as: 'logout' resources :users get 'page/index' root 'page#index' end

步骤12在app / views / sessions / new.html.erb文件中创建一个登录表单。
< h1> Log In< /h1> < %= form_tag sessions_path do %> < div> < %= label_tag :email %> < br> < %= text_field_tag :email %> < /div> < div> < %= label_tag :password %> < br> < %= password_field_tag :password %> < /div> < div> < %= submit_tag "Log In" %> < /div> < % end %>

步骤13转到app / controllers / sessions_controller.rb文件并编写以下代码。
class SessionsController < ApplicationController def new end def create user = User.find_by_email(params[:email]) if user & & user.authenticate(params[:password]) session[:user_id] = user.id redirect_to root_url, notice: 'Logged in!' else render :new end end def destroy session[:user_id] = nil redirect_to root_url, notice: 'Logged out!' end end

步骤14我们需要创建一个current_user方法来访问应用程序中的当前用户。转到app / controllers / application_controller.rb文件, 并编写以下代码。
class ApplicationController < ActionController::Base # Prevent CSRF attacks by raising an exception. # For APIs, you may want to use :null_session instead. protect_from_forgery with: :exception private def current_user User.where(id: session[:user_id]).first end helper_method :current_user end

步骤15转到app / views / layouts / application.html.erb文件, 然后在正文中编写以下代码。
< div id="user_header"> < % if current_user %> Logged in as < %= current_user.email %> . < %= link_to "Log Out", logout_path %> < % else %> < %= link_to "Sign Up", signup_path %> or < %= link_to "Log In", login_path %> < % end %> < /div> < % flash.each do |key, value| %> < %= content_tag(:div, class: "alert alert-#{key}") do %> < p> < %= value %> < /p> < % end %> < % end %>

步骤16从app / views / users / show.html.erb和app / views / layouts / index.html.erb文件中删除以下行。
< p id="notice"> < %= notice %> < /p>

步骤17当新用户注册时, 他/她将自动登录。为此, 我们需要在app / controllers / users_controller.rb文件中设置会话。
def create @user = User.new(user_params) if @user.save session[:user_id] = @user.id redirect_to root_url, notice: 'User successfully created.' else render :new end end

步骤18在控制台中启动Rails服务器。
rails s

步骤19转到浏览器。
Localhost:3000

Rails的会话介绍和用法

文章图片
让我们注册一个用户Anna。
Rails的会话介绍和用法

文章图片
Rails的会话介绍和用法

文章图片
在单击” 后退” 按钮时, 你可以看到所有已登录的用户。
Rails的会话介绍和用法

文章图片
【Rails的会话介绍和用法】现在, 让我们从用户Anna登录。
Rails的会话介绍和用法

文章图片
Rails的会话介绍和用法

文章图片

    推荐阅读