You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建带最新Bootstrap与jQuery支持的Rails7.3.1项目及登录UI指导

Rails7.3.1 + 最新Bootstrap(无jQuery)配置及登录UI实现

一、Bootstrap文件存放位置

Rails7中手动下载的Bootstrap文件,推荐放在以下标准Asset Pipeline目录:

  • CSS文件:将bootstrap.min.css(及自定义主题CSS)放入 app/assets/stylesheets/
  • JS文件:下载包含Popper.js的Bootstrap打包文件bootstrap.bundle.min.js(最新版Bootstrap已内置Popper,无需额外下载),放入 app/assets/javascripts/

二、配置Rails加载Bootstrap

1. 加载CSS

  1. 若你的主样式文件是application.css,重命名为application.scss(支持SCSS语法导入)
  2. 修改app/assets/stylesheets/application.scss,添加:
@import "bootstrap.min";
// 此处可添加自定义CSS规则
  1. 确保config/initializers/assets.rb包含预编译配置:
Rails.application.config.assets.precompile += %w( bootstrap.min.css )

2. 加载JS

修改app/assets/javascripts/application.js,添加:

//= require bootstrap.bundle.min

同样在config/initializers/assets.rb中添加:

Rails.application.config.assets.precompile += %w( bootstrap.bundle.min.js )

三、创建登录UI页面

1. 生成登录控制器

执行命令生成Sessions控制器(处理登录逻辑):

rails generate controller Sessions new create destroy

2. 编写登录视图(app/views/sessions/new.html.erb)

用Bootstrap表单组件实现响应式登录页面:

<div class="container mt-5">
  <div class="row justify-content-center">
    <div class="col-md-6">
      <div class="card shadow-sm">
        <div class="card-header bg-primary text-white">
          <h4 class="mb-0">用户登录</h4>
        </div>
        <div class="card-body">
          <%# 禁用Turbo远程提交,确保表单正常提交 %>
          <%= form_with model: :session, url: sessions_path, method: :post, local: true do |form| %>
            <% if flash[:danger] %>
              <div class="alert alert-danger mb-3">
                <%= flash[:danger] %>
              </div>
            <% end %>
            <div class="mb-3">
              <%= form.label :email, class: "form-label" %>
              <%= form.email_field :email, class: "form-control", placeholder: "请输入注册邮箱", autofocus: true %>
            </div>
            <div class="mb-3">
              <%= form.label :password, class: "form-label" %>
              <%= form.password_field :password, class: "form-control", placeholder: "请输入密码" %>
            </div>
            <div class="mb-3 form-check">
              <%= form.check_box :remember_me, class: "form-check-input" %>
              <%= form.label :remember_me, "记住登录状态", class: "form-check-label" %>
            </div>
            <%= form.submit "登录", class: "btn btn-primary w-100" %>
          <% end %>
        </div>
      </div>
    </div>
  </div>
</div>

3. 配置路由

修改config/routes.rb,添加登录相关路由:

get 'login', to: 'sessions#new'
post 'login', to: 'sessions#create'
delete 'logout', to: 'sessions#destroy'

4. 登录控制器逻辑(app/controllers/sessions_controller.rb)

基础登录验证逻辑示例:

class SessionsController < ApplicationController
  def new
  end

  def create
    user = User.find_by(email: params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
      log_in user
      # 处理"记住我"功能
      params[:session][:remember_me] == '1' ? remember(user) : forget(user)
      redirect_to root_url, notice: "登录成功"
    else
      flash.now[:danger] = '邮箱或密码错误'
      render 'new', status: :unprocessable_entity
    end
  end

  def destroy
    log_out if logged_in?
    redirect_to root_url, status: :see_other
  end
end

补充:ApplicationController中添加认证辅助方法

在app/controllers/application_controller.rb中添加以下方法,支持登录状态管理:

class ApplicationController < ActionController::Base
  helper_method :logged_in?, :current_user

  private

  def log_in(user)
    session[:user_id] = user.id
  end

  def current_user
    @current_user ||= User.find_by(id: session[:user_id])
  end

  def logged_in?
    !current_user.nil?
  end

  def remember(user)
    user.remember # 需要在User模型中定义remember方法生成记住令牌
    cookies.permanent.signed[:user_id] = user.id
    cookies.permanent[:remember_token] = user.remember_token
  end

  def forget(user)
    user.forget # 需要在User模型中定义forget方法重置令牌
    cookies.delete(:user_id)
    cookies.delete(:remember_token)
  end

  def log_out
    forget(current_user)
    session.delete(:user_id)
    @current_user = nil
  end
end

四、注意事项

  • 若你的Rails项目使用Importmap或jsbundling/cssbundling,也可以通过npm安装Bootstrap,但手动下载文件到app/assets更符合传统Asset Pipeline工作流
  • 确保布局文件app/views/layouts/application.html.erb包含样式和JS加载标签:
    <%= stylesheet_link_tag "application", "data-turbo-track": "reload" %>
    <%= javascript_include_tag "application", "data-turbo-track": "reload", defer: true %>
    

内容的提问来源于stack exchange,提问作者jissy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 14:43:16