在上一篇中,我们讨论了如何进行数据迁移和种子数据的处理,建立数据模型的重要性。在本章中,我们将深入探讨如何实现用户注册和登录功能。这是构建一个完整应用程序的基石 – 用户将能通过注册来创建账户,并通过登录功能进入他们的账户。
用户注册功能
1. 创建用户模型
首先,我们需要创建一个用户模型,以便存储用户的注册信息。我们可以使用Rails的命令生成器来创建用户模型及其迁移文件:
1
| rails generate model User username:string email:string password_digest:string
|
接着,我们执行数据迁移:
在用户模型中,我们将使用 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
文件中,我们添加 new
和 create
方法:
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
中添加 login
和 logout
方法:
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
,我们将会更加高效地处理用户的身份验证需求。