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

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

用户注册功能

1. 创建用户模型

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

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

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

1
rails db:migrate

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

1
2
3
4
5
6
7
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. 实现用户注册控制器

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

1
rails generate controller Users

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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 中,我们可以这样创建注册表单:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<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 方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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 中,同样创建一个登录表单:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<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 中配置相关的路由:

1
2
3
4
5
6
7
8
9
10
11
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,我们将会更加高效地处理用户的身份验证需求。

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

https://zglg.work/rails-zero/29/

作者

IT教程网(郭震)

发布于

2024-08-15

更新于

2024-08-16

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论