1.model
- 运行命令
rails g model user
,修改 20200802121327_create_users
class CreateUsers < ActiveRecord::Migration[6.0]
def change
create_table :users do |t|
t.string :username
t.string :password
t.timestamps null:false
end
end
end
- 迁移文件
运行rake db:create
以及rake db:migrate
- 模型验证
class User < ApplicationRecord
validates :username, presence: {message: "用户名不能为空"}
validates :username, uniqueness: {message: "用户名已存在"}
validates :password, presence: {message: "密码不能为空"}
validates :password, length: {minimum: 6, message: "密码长度最短为6位"}
end
2.controller
rails g controller users
class UsersController < ApplicationController
def new
@user = User.new
end
def create
@user = User.new(params.require(:user).permit( :username, :password))
if @user.save
#flash 是一次性的闪现信息,之后用户重新刷新页面等操作不会再出现
flash[:notice] = "注册成功请登录"
redirect_to new_session_path
else
# 这里使用hash,定义render 一个action 保存上次@user对象,及其errors,作为显示,如果换成redirect to则无法保存上次的报错信息
render action: :new
end
end
nd
end
rails g controller sessions
class SessionsController < ApplicationController
def new
end
def create
@user = User.find_by(username: params[:username], password: params[:password])
if @user
session[:user_id] = @user.id
flash[:notice] = "登录成功"
redirect_to root_path
else
flash[:notice] = "用户名或密码不正确"
render action: :new
end
end
def destroy
session[:user_id] = nil
flash[:notice] = "退出成功"
redirect_to root_path
end
end
rails g controller welcome
class WelcomeController < ApplicationController
def index
end
end
3 routes
Rails.application.routes.draw do
root 'welcome#index'
# resource默认会建立7个url路径
resources :users
resources :sessions
end
4 view
- 用户注册 users/new.html.erb
<h1> 用户注册</h1>
<%= form_for @user, url: users_path, method: :post do |f| %>
<% @user.errors.messages.values.flatten.each do |error| %>
<%= error %>
<% end -%>
<%= f.text_field :username, placeholder: "用户名" %>
<%= f.password_field :password, placeholder: "密码" %>
<%= f.submit "注册" %>
<%= link_to "登录",new_session_path %>
<% end -%
- 用户登录 app/views/sessions/new.html.erb
<h1>用户登录</h1>
<%= form_tag sessions_path, method: "post" do %>
<input type="text" name="username" placeholder="用户名" class="form-control" id="form_username" title="用户名6-12个字符">
<input type="password" name="password" placeholder="密码" class=" form-control" id="form_password">
<input type="submit" value="登录"/>
<%= link_to "注册", new_user_path %>
<% end -%>
- 首页面 app/views/welcome
<h1>welcome首页</h1>
- 修改 app/views/layouts/application.html.erb
<!DOCTYPE html>
<html>
<head>
<title>circles</title>
<h1>application 界面!!</h1>
<ul>
<li><a href="/">Home</a></li>
<% if session[:user_id] %>
<%= link_to "退出", sessions_path(session[:user_id]), method: 'delete' %>
<% else %>
<%= link_to "登录", new_session_path %>
<% end -%>
</ul>
<% if flash[:notice] %>
<%= flash[:notice] %>
<% end -%>
<body>
<%= yield %>
</body>
</html>
PS:退出登录仍存在bug,link_to 里的delete请求会forward到get请求,之后闲了专门研究。