【Rails】slickを使ってスライド形式で画像を表示しよう！

slickを利用して複数の画像をスライド形式で表示できる機能を実装します。
今回もレシピアプリを例に作成していきます。

#####完成イメージ
![ビュー.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1140333/b04c6e4b-42ab-df1b-a8f3-1dbf0c73c43f.gif)

**※今回は画像投稿機能が実装されている前提で話を進めていきます。**
画像投稿機能については前回記事にしておりますのでそちらを参照してください。

https://qiita.com/mitaninjin/items/c3d66ca0e806c13930a5

https://qiita.com/mitaninjin/items/9dbb471cc67f30ba1fd7

##slickとは
slickとはjQueryベースの、スライダーを作成するためのプラグインです。

https://kenwheeler.github.io/slick/

##slickの導入
まずはslickの[公式サイト](https://gyazo.com/81335cceee2857e8a79481215da93641)にアクセスし、「**get it now**」を選択します。
![ebd52a29b1c18acc6c10543898b1b455.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1140333/4736e24e-5dbe-9b10-9c0e-37d887f98704.png)

するとページ下部に遷移するので、そこに記載されているCDNのコードをコピーします。
![81335cceee2857e8a79481215da93641.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1140333/edcf1989-f259-9eae-ffaf-69823c2ea88d.png)

コピーしたコードをapplication.html.erbに貼り付けます。

```erb:app/views/layouts/application.html.erb
<!DOCTYPE html>
<html>
  <head>
    <title>Recipe</title>
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>

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

    <link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.css"/>  #追加

    <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>

    <script type="text/javascript" src="//cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.min.js"></script>  #追加
  </head>
#以下略
```

####jQueryの導入
Bootstrapを導入している方は、すでにjQueryが導入されているので飛ばしてください。
Bootstrap導入についてはこちら

https://qiita.com/mitaninjin/items/93553535483919d17a81

それではjQueryを導入していきましょう。

```:ターミナル
yarn add jquery
```

webpackの設定をします。

```javascript:config/webpack/environment.js
const { environment } = require('@rails/webpacker')

//ここから
const webpack = require('webpack')
environment.plugins.append(
  'Provide',
  new webpack.ProvidePlugin({
    $: 'jquery/src/jquery',
    jQuery: 'jquery/src/jquery'
  })
)
//ここまでを追加

module.exports = environment
```
jQueryを読み込ませます。

```javascript:app/javascript/packs/application.js
//中略

require("@rails/ujs").start()
//require("turbolinks").start()
require("@rails/activestorage").start()
require("channels")
require("./preview")
require('jquery')  //追記

//以下略
```
以上でslick、jQueryの導入完了です。

##スライドの実装
####ビューファイルの編集
まずは、表示させたい画像をビューに表示させます。

```erb:app/views/recipes/show.html.erb

<div class="text-center">
  <div class="card recipe-card ">

　　#画像の表示
    <% @recipe.images.each do |image| %>
       <%= image_tag image, class: "card-img-top show-img" %>
    <% end %>

    <div class="card-body">
      <div class="recipe-name">
        <%= @recipe.title %>
      </div>
      <div class="recipe-content">
        カテゴリー: <span class="recipe-category"><%= @recipe.category.name %></span>
        所要時間: <span class="recipe-time"><%= @recipe.time_required.name %></span>
      </div>
      <hr>
      <p class="card-text">
        <div class="recipe-title">作り方</div>
        <div class="recipe-text d-flex justify-content-start">
          <%= safe_join(@recipe.text.split("\n"),tag(:br)) %>
        </div>
      </p>
    </div>
  </div>
</div>
```
このままだと、以下のようにただ画像を3枚縦に並べただけになります。
![db432536e85ee910b2a4192c410ab35c.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1140333/5804c8d9-246f-0680-5e67-af3415eb4f9c.jpeg)


####slick.jsの作成

slickを使用するためのJSファイルを作成します。

```ターミナル
touch app/javascript/packs/slick.js
```
作成したslick.jsに以下のコードを貼り付けます。

```javascript:app/javascript/packs/slick.js
$(function() {
  $('.slider').slick();
});
```
slick.jsを読み込ませます。

```javascript:app/javascript/packs/application.js
//中略

require("@rails/ujs").start()
//require("turbolinks").start()
require("@rails/activestorage").start()
require("channels")
require("./preview")
require('jquery')  
require("./slick") //追記

//以下略
```

そして、ビューファイルを以下のようにsliderのdiv要素でimage_tagを囲うよう再編集します。

```erb:app/views/recipes/show.html.erb
<div class="text-center">
  <div class="card recipe-card ">

    #sliderで囲う
    <div class="slider">
        <% @recipe.images.each do |image| %>
          <%= image_tag image, class: "card-img-top show-img" %>
        <% end %>
    </div>

    <div class="card-body">
      <div class="recipe-name">
        <%= @recipe.title %>
      </div>

#以下略
```
すると以下のようにスライドが実装できます。
![cdfa40caa09410f46978b6da9961f222.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1140333/6cf13c75-d118-1d0b-65c3-b55f41494d04.gif)

####slick.jsの編集
このままでは、上下のボタンが不格好なので表示させないようslick.jsを編集します。
ボタンの代わりに自動でスライドを再生させる記述をします。

```javascript:app/javascript/packs/slick.js
$(function() {
  $('.slider').slick({
      arrows: false,  //ボタン非表示
      autoplay: true, //自動再生
      autoplaySpeed: 4000, //再生スピード
  });
});
```

以上で完成です。
![ビュー.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1140333/b04c6e4b-42ab-df1b-a8f3-1dbf0c73c43f.gif)