首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在Rails 3中实现"记住我"功能?

在Rails 3中实现"记住我"功能,可以使用Devise、Authlogic等第三方库,也可以手动实现。这里我们手动实现一个简单的"记住我"功能。

  1. 添加一个布尔类型的字段remember_token到用户表(User):
代码语言:ruby
复制
rails generate migration AddRememberTokenToUsers remember_token:boolean
rake db:migrate
  1. 在User模型(app/models/user.rb)中添加以下代码:
代码语言:ruby
复制
class User< ActiveRecord::Base
  attr_accessor :remember_me

  before_save :set_remember_token

  private

  def set_remember_token
    if remember_me == "1"
      self.remember_token = true
    end
  end
end
  1. 在用户登录表单中添加一个"记住我"复选框(app/views/sessions/new.html.erb):
代码语言:html
复制
<%= form_for(:session, url: login_path) do |f| %>
  <%= f.label :email %>
  <%= f.text_field :email %>
  <%= f.label :password %>
  <%= f.password_field :password %>
  <%= f.label :remember_me, "记住我" %>
  <%= f.check_box :remember_me %>
  <%= f.submit "登录" %>
<% end %>
  1. 在SessionsController(app/controllers/sessions_controller.rb)中添加以下代码:
代码语言:ruby
复制
class SessionsController< ApplicationController
  def create
    user = User.find_by(email: params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
      if params[:session][:remember_me] == "1"
        cookies.permanent[:remember_token] = user.remember_token
      else
        cookies[:remember_token] = user.remember_token
      end
      redirect_to user
    else
      flash.now[:error] = "邮箱或密码错误"
      render 'new'
    end
  end

  def destroy
    cookies.delete(:remember_token)
    redirect_to root_url
  end
end
  1. 在ApplicationController(app/controllers/application_controller.rb)中添加以下代码:
代码语言:ruby
复制
class ApplicationController< ActionController::Base
  before_action :remember_user

  private

  def remember_user
    @current_user ||= User.find_by(remember_token: cookies[:remember_token])
  end
end

现在,当用户勾选"记住我"复选框时,系统会在登录成功后将一个临时的cookie(remember_token)存储在用户浏览器中,并将其与用户账户关联。当用户再次访问网站时,系统会自动登录用户,直到用户手动注销或者cookie过期。

注意:这个实现方式仅供参考,实际生产环境中建议使用更安全、更可靠的第三方库来实现"记住我"功能。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的合辑

领券