让 Ruby-on-Rails 6/Webpack + Bootstrap 一起正常工作的问题

Posted

技术标签:

【中文标题】让 Ruby-on-Rails 6/Webpack + Bootstrap 一起正常工作的问题【英文标题】:Issues getting Ruby-on-Rails 6/Webpack + Bootstrap working properly together 【发布时间】:2021-05-04 02:20:28 【问题描述】:

我 10 年来第一次重新编写代码,并且总体上很享受这个过程,除了我试图让 Bootstrap 与 Rails6 一起工作的部分。

我已经完成了六个教程,但每个教程似乎都有稍微不同的方法,虽然我现在对整个过程的困惑比我开始时稍微少了一点,但我仍然无法获得我的 Rails 6应用程序以正确呈现某些 Bootstrap 样式(例如:卡片和下拉菜单未按预期呈现——但更改我的 Bootstrap/Webpack 配置使其正确显示,但其他内容会中断。)

我对整个复杂的过程感到非常沮丧,希望得到一些指导。

我的配置:

ruby -v      
ruby 2.6.6p146 (2020-03-31 revision 67876) [x86_64-darwin20]

宝石文件

source 'https://rubygems.org'
git_source(:github)  |repo| "https://github.com/#repo.git" 

# https://devcenter.heroku.com/articles/ruby-versions
ruby '~> 2.6.6'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '~> 6.1.1'
# Use Puma as the app server
gem 'puma', '~> 5.0'
# Use SCSS for stylesheets
gem 'sass-rails', '>= 6'
# Transpile app-like javascript. Read more: https://github.com/rails/webpacker
gem 'webpacker', '~> 5.0'
# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks
gem 'turbolinks', '~> 5'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 2.7'
# Use Redis adapter to run Action Cable in production
# gem 'redis', '~> 4.0'
# Use Active Model has_secure_password
# gem 'bcrypt', '~> 3.1.7'

gem 'redcarpet', '~> 3.5.1'
gem 'bootstrap-sass', '~> 3.4.1'

gem 'devise'
gem 'toastr-rails'
gem 'jquery-rails'
gem 'rails_admin', '~> 2.0'
gem 'cancancan'

(等等)

package.json


  "name": "dcm",
  "private": true,
  "dependencies": 
    "@rails/actioncable": "^6.0.0",
    "@rails/activestorage": "^6.0.0",
    "@rails/ujs": "^6.0.0",
    "@rails/webpacker": "5.2.1",
    "bootstrap": "^4.6.0",
    "bootstrapper": "^0.1.3",
    "jquery": "^3.5.1",
    "popper.js": "^1.16.1",
    "toastr": "^2.1.4",
    "turbolinks": "^5.2.0"
  ,
  "version": "0.1.0",
  "devDependencies": 
    "webpack-dev-server": "^3.11.2"
  

config/webpack/environment.js

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

应用程序.scss

@import 'bootstrap';
@import 'toastr';

应用程序.js

import Rails from "@rails/ujs"
import Turbolinks from "turbolinks"
import * as ActiveStorage from "@rails/activestorage"
import "channels"

import "bootstrap"
//import 'bootstrap/dist/css/bootstrap.min.css';

import "../stylesheets/application"
global.toastr = require("toastr")

document.addEventListener("turbolinks:load", () => 
        $('[data-toggle="tooltip"]').tooltip()
        $('[data-toggle="popover"]').popover()
)

Rails.start()
Turbolinks.start()
ActiveStorage.start()

application.scss(目前已被注释掉)

// @import 'toastr';
// @import '~bootstrap/scss/bootstrap';

application.html.erb

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>XXXXX</title>
    <meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no">
    <meta charset="utf-8">
    <%= 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' %>

感谢您提供的任何见解,说明为什么这会导致我出现问题!

【问题讨论】:

mentalized.net/journal/2019/10/19/use-sass-modules-in-rails - 相同的设置适用于旧的 @import 指令。 谢谢 Max - 我以前没有看到任何迹象表明我需要一个不同的 sass 系统并且我没有编译问题。 sass-rails(Ruby 编译器)和 sassc-rails(libsass)gem 都已弃用。 Ruby 编译器已经 eol 很长时间了,而且速度很慢。 Libsass 最近贬值了,只剩下 Dart-sass。 Dart-sass 是唯一包含新的 @use 指令的编译器,该指令替换了 @include,它最终会在您升级前端包时破坏您的应用程序。 谢谢 max - 现在我头疼... 如果您想要一个快速且临时的解决方案,请将 sass-rails 替换为 sassc-rails,您会看到资产编译速度大幅提升。 【参考方案1】:

伙计们,我想我已经想通了。我遵循了这个非常有帮助的教程,并且很好地解释了事情是如何工作的(并且让我相信我的配置在开发和生产中会始终如一地工作):

https://www.vic-l.com/setup-bootstrap-in-rails-6-with-webpacker-for-development-and-production

但我也只是查看了生成和交付的 CSS 文件(通过 chrome 中的开发工具),并将它与我在代码中定义的引导类进行了比较,这些引导类基于我读过的各种教程,并发现有一些不匹配。因此,我还根据直接阅读我的 Bootstrap 版本的 Bootstrap 文档重新设计了我的 CSS,并设法解决了我的大部分问题。

感谢阅读:-)

【讨论】:

以上是关于让 Ruby-on-Rails 6/Webpack + Bootstrap 一起正常工作的问题的主要内容,如果未能解决你的问题,请参考以下文章

Ruby-on-Rails:如何摆脱“你被重定向”页面

ruby-on-rails - 嵌套资源问题

ubuntu中ruby-on-rails的安装

Ruby-on-Rails 3.2:导出包含大型数据集(100,000 条记录)的 CSV

如何在 Ruby-on-Rails 中生成 PDF 表单

基于 Ruby-on-Rails 开发以太坊的应用