Jupyter AI

29 用户身份验证之用户注册和登录功能

📅发表日期: 2024-08-15

🏷️分类: Ruby框架

👁️阅读次数: 0

在上一篇中,我们讨论了如何进行数据迁移和种子数据的处理,建立数据模型的重要性。在本章中,我们将深入探讨如何实现用户注册和登录功能。这是构建一个完整应用程序的基石 -- 用户将能通过注册来创建账户,并通过登录功能进入他们的账户。

用户注册功能

1. 创建用户模型

首先,我们需要创建一个用户模型,以便存储用户的注册信息。我们可以使用Rails的命令生成器来创建用户模型及其迁移文件:

rails generate model User username:string email:string password_digest:string

接着,我们执行数据迁移:

rails db:migrate

在用户模型中,我们将使用 has_secure_password 方法来处理密码加密。请确保在 User 模型中加入以下代码:

class User < ApplicationRecord
  has_secure_password

  validates :username, presence: true, uniqueness: true
  validates :email, presence: true, uniqueness: true
  validates :password, length: { minimum: 6 }
end

2. 实现用户注册控制器

接着,我们需要创建一个控制器,用于处理用户注册请求:

rails generate controller Users

在生成的 users_controller.rb 文件中,我们添加 newcreate 方法:

class UsersController < ApplicationController
  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)
    if @user.save
      # 注册成功后,直接登录用户并重定向到个人中心
      session[:user_id] = @user.id
      redirect_to root_path, notice: "注册成功!"
    else
      render :new
    end
  end

  private

  def user_params
    params.require(:user).permit(:username, :email, :password)
  end
end

3. 注册页面视图

我们需要添加一个注册页面。在 views/users/new.html.erb 中,我们可以这样创建注册表单:

<h1>用户注册</h1>
<%= form_with model: @user, local: true do |form| %>
  <% if @user.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@user.errors.count, "error") %> prohibited this user from being saved:</h2>
      <ul>
        <% @user.errors.full_messages.each do |message| %>
          <li><%= message %></li>
        <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= form.label :username %>
    <%= form.text_field :username %>
  </div>

  <div class="field">
    <%= form.label :email %>
    <%= form.email_field :email %>
  </div>

  <div class="field">
    <%= form.label :password %>
    <%= form.password_field :password %>
  </div>

  <div class="actions">
    <%= form.submit "注册" %>
  </div>
<% end %>

用户登录功能

1. 添加登录控制器

为了处理用户登录,我们同样需要一个控制器。我们可以在 users_controller.rb 中添加 loginlogout 方法:

class UsersController < ApplicationController
  # ...之前的代码...

  def login
    @user = User.find_by(email: params[:email])
    if @user&.authenticate(params[:password])
      session[:user_id] = @user.id
      redirect_to root_path, notice: "登录成功!"
    else
      flash.now[:alert] = "邮箱或密码错误。"
      render :login
    end
  end

  def logout
    session[:user_id] = nil
    redirect_to root_path, notice: "成功登出!"
  end

  # ...之前的代码...
end

2. 登录页面视图

views/users/login.html.erb 中,同样创建一个登录表单:

<h1>用户登录</h1>
<%= form_with url: login_path, method: :post, local: true do |form| %>
  <div class="field">
    <%= form.label :email %>
    <%= form.email_field :email %>
  </div>

  <div class="field">
    <%= form.label :password %>
    <%= form.password_field :password %>
  </div>

  <div class="actions">
    <%= form.submit "登录" %>
  </div>
<% end %>

3. 路由设置

确保在 config/routes.rb 中配置相关的路由:

Rails.application.routes.draw do
  # 用户注册路由
  resources :users, only: [:new, :create]

  # 登录登出路由
  get 'login', to: 'users#login'
  post 'login', to: 'users#login'
  get 'logout', to: 'users#logout'

  root 'home#index'  # 假设有一个主页
end

总结

在本章中,我们实现了基本的用户注册和登录功能。用户可以通过注册创建账户,通过登录进入系统。下一章将继续探讨如何使用 Devise 来简化这一过程,并增强安全性和功能。通过 Devise,我们将会更加高效地处理用户的身份验证需求。

💬 评论

暂无评论

🌟Rails 入门 (滚动鼠标查看)