【问题标题】:What is the best way to install bootstrap with rails app?使用 rails 应用程序安装引导程序的最佳方法是什么?
【发布时间】:2017-03-04 14:19:50
【问题描述】:

我是rails的新手,所以我想问一下如何在rails中使用bootstrap? 在学习后端开发之前,我曾经简单地在 html 文件的 html 标记的头部调用它,如下所示:

<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">

<!-- jQuery library -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>

<!-- Latest compiled JavaScript -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

所以我想知道在 Rails 中做这件事的正确方法是什么?我是否应该这样做并将这些调用放在应用程序布局视图文件的 html 标记的头部(jQuery 除外,因为它已经实现了)?

既然这么简单,那为什么人们要为 bootstrap 制作特殊的宝石呢?

我很确定有很多我遗漏或不知道的点,所以我希望得到一些澄清和指导。

PS:rails 应用已经存在,我只是想用 bootstrap 来调整设计..

【问题讨论】:

  • 使用 gem 或将源文件放入 vendor/assets

标签: ruby-on-rails twitter-bootstrap


【解决方案1】:

为什么要安装引导 gem?

由于 rails 使用 asset pipeline 来缩小和压缩样式表、javascript 和图像,因此使用 sass 版本的 bootstrap 是包含 bootstrap 的首选方式,而不是简单地将 bootstrap 包含在应用程序布局视图中。此外,如果您只是在头文件中包含 bootstrap,则包含的文件必须是 bootstrap 的编译版本(它只是一个 css 文件)。但是,由于我们将在您的应用程序中包含 sass 版本的 bootstrap,您将可以访问 bootstrap 的 sass 变量、mixin 和其他与 sass 相关的出色功能。您无法通过在应用程序布局视图中包含已编译资产来获得该功能。通过在您的 application.scss 文件中导入 sass,rails 将即时编译您的引导程序和资产,并为您的应用程序设计提供更大的灵活性。

将 Bootstrap 添加到您的 Rails 应用程序

根据bootstrap-sass gem,需要添加

'gem 'bootstrap-sass'

到你的 Gemfile 然后运行

bundle install

接下来,您需要在应用程序 css 清单文件中导入引导样式表。但是,默认情况下,清单文件被命名为:

app/assets/stylesheets/application.css

但您应该将其重命名为使用 .scss 扩展名(或 .sass 扩展名),如下所示:

app/assets/stylesheets/application.scss

现在,删除 application.scss 文件中的所有内容并添加以下两行:

@import "bootstrap-sprockets";
@import "bootstrap";

从现在开始,您需要手动处理 scss 文件的导入。

接下来,要使 bootstrap 的 javascript 帮助程序可用,您需要添加以下行:

//= require bootstrap-sprockets

给你的

app/assets/javascripts/application.js

您需要添加该行,以使您的 application.js 文件如下所示:

// This is a manifest file that'll be compiled into application.js, which will include all the files
// listed below.
//
// Any JavaScript/Coffee file within this directory,   lib/assets/javascripts, vendor/assets/javascripts,
// or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
//
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
// compiled file. JavaScript code in this file should be added after the last require_* statement.
//
// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
// about supported directives.
//
//= require jquery
//= require jquery_ujs
//= require bootstrap-sprockets
//= require turbolinks
//= require_tree .

【讨论】:

  • 也有人支持像 op 那样通过 CDN 提供文件,我觉得实际上要好得多。
  • 手动导入新的scss文件的语法是什么?这是否发生在application.scss 文件中,位于@import "bootstrap"; 下方?
  • 刚刚想出了这个。在尝试导入其他文件时将 css 混合到 application.scss 时遇到问题。通过创建一个global.scss 文件然后将它和page.scssbootstrap 导入application.scss 来解决我的问题。
  • @Eyeslandic 您能否详细说明您发现使用 CDN 比使用 gem 更好的原因?我更喜欢 CDN 还因为由于分布式特性,它们可能会更快地加载,还因为如果广泛使用它们可能已经被缓存。还是我还缺少什么?
  • 为什么这比在 webpack(er) 和 package.json 级别包含引导程序“更好”? (主观答案很好。)
【解决方案2】:

现在,在 Bootstrap 4 中,您只需将 @import 'bootstrap'; 添加到您的 application.scss 即可。如果您还没有将您的 application.css 重命名为 application.scss

@import 'bootstrap';

将 gem 添加到您的 Gem file

之后
...
# Bootstrap
gem 'bootstrap', '~> 4.1.1'
# Use SCSS for stylesheets
gem 'sass-rails', '~> 5.0'
...

使用 Sass 版本的优点

  1. 您可以将默认引导变量更改为您自己的自定义变量
  2. 您可以编写自己的函数和混合,而无需重新编译和担心 Bootstrap 的更新/修复

【讨论】:

    【解决方案3】:

    1.

    rails new bootstrappy
    

    2.

    cd bootstrappy
    

    3.

    yarn add bootstrap jquery popper.js
    

    4.

    environment.js

    config/webpack/environment.js
    

    添加以下内容:

    const webpack = require("webpack")
    
    environment.plugins.append("Provide", new webpack.ProvidePlugin({
        $: 'jquery',
        jQuery: 'jquery',
        Popper: ['popper.js', 'default']
    }))
    

    5.

    application.js

    位置:app/javascript/packs/application.js 添加:

    import "bootstrap"
    import "../stylesheets/application"
    
    document.addEventListener("turbolinks:load", () => {
        $('[data-toggle="tooltip"]').tooltip()
        $('[data-toggle="popover"]').popover()
    })
    

    6.

    app/javascript 中创建stylesheets 文件夹

    mkdir app/javascript/stylesheets
    

    stylesheets文件夹中创建文件:application.scss

    7.

    app/javascript/stylesheets/application.scss 中添加:

    @import "~bootstrap/scss/bootstrap";
    

    8。 更新:app/views/layouts/application.html.erb

    添加:

    <%= stylesheet_pack_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>   
    

    application.html.erb 看起来像这样:

    <!DOCTYPE html>
    <html>
      <head>
        <title>Bootstrappy</title>
        <%= csrf_meta_tags %>
        <%= csp_meta_tag %>
    
        <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
        <%= stylesheet_pack_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
        <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
      </head>
    
      <body>
        <%= yield %>
      </body>
    </html>
    

    9。 测试一下:

    添加navbartooltipspopover到:

    app/views/layouts/application.html.erb

    <!DOCTYPE html>
    <html>
      <head>
        <title>Bootstrappy</title>
        <%= csrf_meta_tags %>
        <%= csp_meta_tag %>
        <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 
        'reload' %>
        <%= stylesheet_pack_tag 'application', media: 'all', 'data-turbolinks-track': 
        'reload' %>
        <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
      </head>
      <body>   
    
      <!-- add navbar -->
    
      <nav class="navbar navbar-expand-lg navbar-light bg-light">
        <a class="navbar-brand" href="#">Navbar</a>
        <button class="navbar-toggler" type="button" data-toggle="collapse" data- 
          target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria- 
          expanded="false" aria-label="Toggle navigation">
          <span class="navbar-toggler-icon"></span>
        </button>
    
        <div class="collapse navbar-collapse" id="navbarSupportedContent">
          <ul class="navbar-nav mr-auto">
            <li class="nav-item active">
              <a class="nav-link" href="#">Home <span class="sr-only">(current)</span></a>
            </li>
            <li class="nav-item">
              <a class="nav-link" href="#">Link</a>
            </li>
            <li class="nav-item dropdown">
              <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" 
                role="button" 
                data-toggle="  dropdown" aria-haspopup="true" aria-expanded="false">
                Dropdown
              </a>
              <div class="dropdown-menu" aria-labelledby="navbarDropdown">
                <a class="dropdown-item" href="#">Action</a>
                <a class="dropdown-item" href="#">Another action</a>
                <div class="dropdown-divider"></div>
                <a class="dropdown-item" href="#">Something else here</a>
              </div>
            </li>
            <li class="nav-item">
              <a class="nav-link disabled" href="#" tabindex="-1" aria- 
                disabled="true">Disabled</a>
            </li>
          </ul>
          <form class="form-inline my-2 my-lg-0">
            <input class="form-control mr-sm-2" type="search" placeholder="Search" aria- 
              label="Search">
            <button class="btn btn-outline-success my-2 my-sm-0" 
              type="submit">Search</button>
          </form>
        </div>
      </nav>
    
      <!-- add tooltips -->
    
      <button type="button" class="btn btn-secondary" data-toggle="tooltip" data- 
        placement="top" title="Tooltip on top">
        Tooltip on top
      </button>
      <button type="button" class="btn btn-secondary" data-toggle="tooltip" data- 
        placement="right" title="Tooltip on right">
        Tooltip on right
      </button>
      <button type="button" class="btn btn-secondary" data-toggle="tooltip" data- 
        placement="bottom" title="Tooltip on bottom">
        Tooltip on bottom
      </button>
      <button type="button" class="btn btn-secondary" data-toggle="tooltip" data- 
        placement="left" title="Tooltip on left">
        Tooltip on left
      </button>
    
      <!-- add popover -->
    
      <button type="button" class="btn btn-lg btn-danger" data-toggle="popover" 
        title="Popover title"   data-content="And here's some amazing content. It's very 
        engaging. Right?">Click to toggle popover</button>
      <%= yield %>
      </body>
    </html>
    

    10.

    rails g controller main index
    

    11.

    更新app/config/routes.rb

    像这样:

    Rails.application.routes.draw do
      root to: 'main#index'
    end
    

    12.

    运行start rails server

    13. 请点击此链接:

    http://localhost:3000/ 尽情享受吧!

    【讨论】:

      【解决方案4】:

      引入bootstrap-sass gem 或使用 NPM 包的一个主要原因是,您可以配置、覆盖和使用 Bootstrap 的 Sass 变量和 mixin。当您从 CDN 中提取时,您将获得预编译和缩小的 CSS,因此您想要覆盖的任何样式都必须直接在您想要修改的元素上完成,而使用变量将允许您一致地修改样式overriding their variables 的所有引导组件,您也可以使用他们可用的wide variety of mixins

      CDN 非常方便,如果您只想使用常规引导默认设置启动并运行。使用 CDN 版本的网站越多,用户就越有可能已经下载了该资产,并且无需为您的网站再次请求。

      但是,针对 CDN 的其他几点:

      1) 您无法控制 CDN,因此如果他们出现中断或某种错误,您就有点不走运了。您通常需要某种 CDN 以一种或另一种方式呈现您的资产,但最好有一个您可以对其进行配置控制的 CDN,这样您就可以执行手动清除缓存或禁用调试等操作。

      2) 当您使用 CDN 而不是 gem 或 NPM 包时,功能测试会更慢,因为它们最终还必须下载资产。这也可能导致测试不稳定,这是我们在使用 CDN 资产时在 CI 中特别注意到的。

      我们从不久前的boostrap-sass gem 切换到了 NPM 包。它的工作原理与@Mark 的描述或their instructions 基本相同,但我们必须将包的路径添加到我们的config/initializers/assets.rb 文件中:

      # config/initializers/assets.rb
      Rails.application.config.assets.paths += [
        # paths for CSS assets in node_modules directory
        Rails.root.join('node_modules', 'bootstrap-sass', 'assets', 'stylesheets')
      ]
      

      【讨论】:

        【解决方案5】:

        Rails 6 中,使用 Webpacker 和 Yarn 作为默认选项,我安装了没有 basically following this nice writeup 的 gem 的引导程序。从依赖安装开始:

        yarn add bootstrap jquery popper.js
        

        将依赖添加到我的app/javascript/packs/application.js:

        require("bootstrap")
        

        我将app/assets/stylesheets/application.css 更改为.scss。 (这篇文章使用了一个自定义文件。)我删除了所有 *= require_ 行并添加了:

        @import "bootstrap/scss/bootstrap";
        

        就是这样。重新启动服务器后,我可以在布局中添加一个容器和一个带有下拉菜单的导航栏。

        【讨论】:

          【解决方案6】:

          第 1 步:使用 Yarn:

          yarn add bootstrap@4.3.1 jquery popper.js
          

          package.json 文件应如下所示

          "dependencies": {
              "@rails/actioncable": "^6.0.0",
              "@rails/activestorage": "^6.0.0",
              "@rails/ujs": "^6.0.0",
              "@rails/webpacker": "4.2.2",
              "bootstrap": "4.3.1",
              "jquery": "^3.4.1",
              "popper.js": "^1.16.1",
              "turbolinks": "^5.2.0"
            },
          

          第 2 步:前往 config/webpack/environment.js 文件并添加这些行

          const { environment } = require('@rails/webpacker')
          
          const { environment } = require('@rails/webpacker')
          
          const webpack = require("webpack")
          
          environment.plugins.append("Provide", new webpack.ProvidePlugin({
          
          $: 'jquery',
          
          jQuery: 'jquery',
          
          Popper: ['popper.js', 'default']
          
          }))
          
          module.exports = environment
          

          第 3 步:前往 app/assets/stylesheets/application.css 并添加这些行

          *= require bootstrap
          
          *= require_tree .
          
          *= require_self
          

          恭喜!您已成功安装 Bootstrap 4

          复制自https://dev.to/somnathpaul/add-bootstrap-4-to-your-ruby-on-rails-6-application-ole

          【讨论】:

          • 更新:目前在 rails 6 popper.js 必须以 @popperjs/core 的形式添加到 yarn 中,并在 environment.js 中提及相同的内容。 stackoverflow.com/a/67011860/6646404
          【解决方案7】:

          向 Rails 应用程序添加扩展的常用方法是将它们包含在 Gemfile

          这是所有库所在的地方,它是受版本控制的,在引导程序等情况下,资产将由 rails 资产管道处理

          这是 boostrap gem 的网站:https://github.com/twbs/bootstrap-sass

          【讨论】:

            猜你喜欢
            • 2011-06-05
            • 2020-01-05
            • 1970-01-01
            • 2016-03-18
            • 1970-01-01
            • 2010-12-31
            • 2010-09-13
            • 2010-12-08
            • 1970-01-01
            相关资源
            最近更新 更多