I'm using Ruby on Rails 6 and webpacker. Tried to add carousel slide looks like this(Bootstrap 4 Card Slider)
However, when I clicked the button to show the next(or previous) slide, Uncaught TypeError: $(...).carousel is not a function popped up in the console. Even I write a script $('.carousel').carousel directly in the console, same error occurred.
I saw that loading JQuery multiple times causes similar error, but I don't know I did that.
Below are my codes. Any suggestion is helpful.
app/views/home_page/test.html.erb
<%= javascript_pack_tag "carousel" %>
<section class="container p-t-3">
<div class="row">
<div class="col-lg-12">
<h1>Bootstrap 4 Card Slider</h1>
</div>
</div>
</section>
<section class="carousel slide" data-ride="carousel" id="postsCarousel">
<div class="container">
<div class="row">
<div class="col-xs-12 text-md-right lead">
<a class="btn btn-outline-secondary prev" href="" title="go back"><i class="fa fa-lg fa-chevron-left"></i></a>
<a class="btn btn-outline-secondary next" href="" title="more"><i class="fa fa-lg fa-chevron-right"></i></a>
</div>
</div>
</div>
<div class="container p-t-0 m-t-2 carousel-inner">
<div class="row row-equal carousel-item active m-t-0">
<div class="col-md-3">
<div class="card">
<div class="card-img-top card-img-top-250">
<img class="img-fluid" src="http://i.imgur.com/EW5FgJM.png" alt="Carousel 1">
</div>
</div>
</div>
<div class="col-md-3">
<div class="card">
<div class="card-img-top card-img-top-250">
<img class="img-fluid" src="http://i.imgur.com/Hw7sWGU.png" alt="Carousel 2">
</div>
</div>
</div>
<div class="col-md-3">
<div class="card">
<div class="card-img-top card-img-top-250">
<img class="img-fluid" src="http://i.imgur.com/g27lAMl.png" alt="Carousel 3">
</div>
</div>
</div>
</div>
<div class="row row-equal carousel-item m-t-0">
<div class="col-md-3">
<div class="card">
<div class="card-img-top card-img-top-250">
<img class="img-fluid" src="//visualhunt.com/photos/l/1/office-student-work-study.jpg" alt="Carousel 4">
</div>
</div>
</div>
<div class="col-md-3">
<div class="card">
<div class="card-img-top card-img-top-250">
<img class="img-fluid" src="//visualhunt.com/photos/l/1/working-woman-technology-computer.jpg" alt="Carousel 5">
</div>
</div>
</div>
<div class="col-md-3 fadeIn wow">
<div class="card">
<div class="card-img-top card-img-top-250">
<img class="img-fluid" src="//visualhunt.com/photos/l/1/people-office-team-collaboration.jpg" alt="Carousel 6">
</div>
</div>
</div>
</div>
</div>
</section>
app/javascript/packs/carousel.js
(function($) {
"use strict";
// manual carousel controls
$('.next').click(function(){ $('.carousel').carousel('next');return false; });
$('.prev').click(function(){ $('.carousel').carousel('prev');return false; });
})(jQuery);
config/webpack/environment.js
const { environment } = require('@rails/webpacker')
const webpack = require('webpack')
environment.plugins.prepend(
'Provide',
new webpack.ProvidePlugin({
$: 'jquery/src/jquery',
jQuery: 'jquery/src/jquery',
jquery: 'jquery/src/jquery',
Popper: 'popper.js'
})
)
module.exports = environment
app/javascript/packs/application.js
require("@rails/ujs").start()
require("turbolinks").start()
require("@rails/activestorage").start()
require("channels")
require("trix")
require("@rails/actiontext")
import '../src/application'
import 'bootstrap'
app/javascript/src/application.scss
@import '~bootstrap/scss/bootstrap';
package.json
{
"name": "sample",
"private": true,
"dependencies": {
"@rails/actioncable": "^6.0.0",
"@rails/actiontext": "^6.0.2-1",
"@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",
"trix": "^1.0.0",
"turbolinks": "^5.2.0"
},
"version": "0.1.0",
"devDependencies": {
"webpack-dev-server": "^3.10.1"
}
}
I have the following in my environment.js:
const { environment } = require('@rails/webpacker')
const webpack = require('webpack')
environment.plugins.prepend('Provide',
new webpack.ProvidePlugin({
$: 'jquery',
jQuery: 'jquery',
Popper: ['popper.js', 'default']
})
)
module.exports = environment
which makes jquery work with webpacker.
Then in your application.scss
@import '~bootstrap';
Next your test.html.rb is in a bit of a mess. This is a cut down version that works without the cards and other styling:
<section class="container">
<h1>Bootstrap 4 Card Slider</h1>
</section>
<section class="container">
<a class="btn btn-lg" href="#carouselExample" role="button" data-slide="prev">
<span> « </span>
</a>
<a class="btn btn-lg" href="#carouselExample" role="button" data-slide="next">
<span> » </span>
</a>
<div id="carouselExample" class="carousel slide" data-ride="carousel">
<div class="carousel-inner">
<div class="carousel-item active">
<img class="d-block w-100" src="http://i.imgur.com/EW5FgJM.png" alt="First slide">
</div>
<div class="carousel-item">
<img class="d-block w-100" src="http://i.imgur.com/Hw7sWGU.png" alt="Second slide">
</div>
<div class="carousel-item">
<img class="d-block w-100" src="http://i.imgur.com/g27lAMl.png" alt="Third slide">
</div>
</div>
</div>
</section>
This uses data attributes so you don't need any of the javascript in carousel.js. Get something like this to work and then add your cards and styling back in.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With