rails 实现登录和注册功能

来源:互联网 发布:广告宣传页设计软件 编辑:程序博客网 时间:2024/05/17 04:07

思路:用户注册需要user这个model, user控制器控制用户的注册功能,session控制器控制用户的登录功能,welcome控制器控制用户登录和退出的跳转,为了表单友好,增加bootstrap样式


生成User model
rails g model user


修改db/migrate生成的文件
class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
    t.string :username
    t.string :password
      t.timestamps null: false
    end
  end
end


迁移文件
rake db:migrate

模型验证

class User < ActiveRecord::Base

  validates :username, presence: { message: "用户名不能为空" }
  validates :username, uniqueness: { message: "用户名已存在" }
  validates :password, presence: { message: "密码不能为空" }
  validates :password, length: { minimum: 6, message: "密码长度最短为6位" }

end


生成控制器
rails g controller users
rails g controller sessions
rails g controller welcome


生成对应的路由
resources :users
resources :sessions
root "welcome#index"


生成注册表单

views/users/new.html.erb


<h1>用户注册</h1>
<div class="row">
  <div class="col-sm-5">
    <%= form_for @user, url: users_path, method: :post do |f| %>
      <div class="form-group">
        <ul class="list-unstyled">
          <% @user.errors.messages.values.flatten.each do |error| %>
            <li><i class="fa fa-exclamation-circle"></i> <%= error %></li>
          <% end -%>
        </ul>
      </div>
      <div class="form-group">
        <%= f.text_field :username, class: "form-control", placeholder: "用户名" %>
      </div>
      <div class="form-group">
        <%= f.password_field :password, class: "form-control", placeholder: "密码" %>
      </div>
      <%= f.submit "注册", class: "btn btn-primary" %> 
      <%= link_to "登录", new_session_path %>
    <% end -%>
  </div>
  <div class="col-sm-7">
  </div>
</div>


user_controller.rb


class UsersController < ApplicationController

def new
@user = User.new
end

def create
@user = User.new(params.require(:user).permit(:username, :password))
if @user.save
flash[:notice] = '注册成功,请登录'
redirect_to new_session_path
else
render action: :new
end
end

end


生成登录表单

views/sessions/new.html.erb


<h1>用户登录</h1>
<div class="row">
  <div class="col-sm-4">
    <%= form_tag sessions_path, method: "post" do %>
      <div class="form-group">
        <input type="text" name="username" placeholder="用户名..." class="form-control" id="form_username" title="用户名6-12个字符">
      </div>
      <div class="form-group">
        <input type="password" name="password" placeholder="密码..." class="form-control" id="form_password">
      </div>
      <input type="submit" class="btn btn-primary" value="登录" /> 
      <%= link_to "注册", new_user_path %>
    <% end %>
  </div>
  <div class="col-sm-8">
  </div>
</div>


sessions_controller.rb


class SessionsController < ApplicationController

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


首页表单

views/welcome/index.html.erb


<% if @user %>
  <h1>欢迎你, <%= @user.username %></h1>
<% else %>
  <h1>Circles 首页</h1> 
<% end -%>

修改layouts/application.html.erb 文件

<!DOCTYPE html>
<html>
  <head>
    <title>Circles</title>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
    
    <%= stylesheet_link_tag    'application', media: 'all' %>
    <%= javascript_include_tag 'application' %>
    <%= csrf_meta_tags %>
  </head>
  <body>
    <header name="top">
      <nav class="navbar navbar-default navbar-fixed-top nav-color" role="navigation" id="nav">
        <div class="container">
          <!-- Brand and toggle get grouped for better mobile display -->
          <div class="navbar-header nav-color">
            <button id="nav_collapse" type="button" class="navbar-toggle toggle-btn" data-toggle="collapse" data-target="#bs-navbar-collapse-1" aria-controls="bs-navbar-collapse-1">
              <span class="fa fa-bars fa-lg"></span>
            </button>
            <a class="navbar-brand custom-logo-link" href="/">
              Circles
            </a>
          </div>

          <!-- Collect the nav links, forms, and other content for toggling -->
          <div class="collapse navbar-collapse nav-submenu-color collapse" id="bs-navbar-collapse-1">
            <ul class="nav navbar-nav navbar-right custom">
              <li>
                <a href="/">Home</a>
              </li>

              <% if session[:user_id] %>
                <li><%= link_to "#{User.find_by(session[:user_id]).username}, 退出", session_path(session[:user_id]), method: 'delete' %></li>
              <% else %>
                <li><%= link_to "登录", new_session_path %></li>
              <% end -%>
            </ul>
          </div>
          <!-- /.navbar-collapse -->
        </div>
        <!-- /.container-->
      </nav>
    </header>


    <div class="container body-offset">
      <% if flash[:notice] %>
        <div class="alert alert-info"><%= flash[:notice] %></div>
      <% end -%>
      
      <%= yield %>
    </div>
  </body>
</html>



1 0
原创粉丝点击