29 用户身份验证之用户注册和登录功能
在上一篇中,我们讨论了如何进行数据迁移和种子数据的处理,建立数据模型的重要性。在本章中,我们将深入探讨如何实现用户注册和登录功能。这是构建一个完整应用程序的基石 -- 用户将能通过注册来创建账户,并通过登录功能进入他们的账户。
用户注册功能
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
文件中,我们添加 new
和 create
方法:
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
中添加 login
和 logout
方法:
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
,我们将会更加高效地处理用户的身份验证需求。