rails项目(四)——用户的注册和登录

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请求,之后闲了专门研究。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值