gretelをつかわずにRailsでパンくずリストを作成

# パンくずリストとは

こういうやつです。
[![Image from Gyazo](https://i.gyazo.com/3d24c39395eaaf44c2f8093549f37cdf.png)](https://gyazo.com/3d24c39395eaaf44c2f8093549f37cdf)

gretelというgemを使うとスッキリ作れるみたいなのですが、当時このgemを知らなかったたま力技で作りました。

# ページを判断するメソッド

ページごとにリストが違うため、現在どのページなのかを判断するメソッドをつくりました。

```ruby:app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
 before_action :request_path

 def request_path
    @path = controller_path + '#' + action_name
    def @path.is(*str)
        str.map{|s| self.include?(s)}.include?(true)
    end
  end
end
```

アプリケーションコントローラーにbefore_actionとして設定しているので、ページが遷移するたびにこのメソッドが発動されます。

### コードの説明
ページ遷移する際のコントローラー名とアクション名を取得し、@pathに"コントローラー名#アクション名"という形で格納します。

次に引数を配列で取得し、その配列の中に@pathであるものがあるか確かめます。
配列の中にひとつでもtrueがあれば、tureを返しています。

メソッドの呼び出しは例えばこのような形です。

```ruby
- unless @path.is('products#index')
    .breadcrumbs
      %ul
        %li
   
```
引数に「products#index」を渡しているので、productコントローラーのindexアクションの遷移先であるビューでなければ、breadcrumbsクラスが表示されるようになっています。

# 完成したパンくずリスト

```ruby
- unless @path.is('products#index')
    .breadcrumbs
      %ul
        %li
          = link_to "○○", root_path
        - if @path.is('categories#index')
          %li
            = icon 'fas', 'chevron-right'
          %li
            %p.last カテゴリー一覧
        - if @path.is('categories#show') && @category.indirect_ids.present?
          %li
            = icon 'fas', 'chevron-right'
          %li
            = link_to "カテゴリー一覧", categories_path, data: {"turbolinks": false}
          %li
            = icon 'fas', 'chevron-right'
          %li
            %p.last #{@category.name}
        - if @path.is('categories#show') && @category.indirect_ids.empty? && @category.children.present?
          %li
            = icon 'fas', 'chevron-right'
          %li
            = link_to "カテゴリー一覧", categories_path
          %li
            = icon 'fas', 'chevron-right'
          %li
            = link_to "#{@category.parent.name}", category_path(@category.parent)
          %li
            = icon 'fas', 'chevron-right'
          %li
            %p.last #{@category.name}
        - if @path.is('categories#show') && @category.children.empty?
          %li
            = icon 'fas', 'chevron-right'
          %li
            = link_to "カテゴリー一覧", categories_path
          %li
            = icon 'fas', 'chevron-right'
          %li
            = link_to "#{@category.parent.parent.name}", category_path(@category.parent.parent)
          %li
            = icon 'fas', 'chevron-right'
          %li
            = link_to "#{@category.parent.name}", category_path(@category.parent)
          %li
            = icon 'fas', 'chevron-right'
          %li
            %p.last #{@category.name}
        - if @path.is('users#show')
          %li
            = icon 'fas', 'chevron-right'
          %li
            %p.last マイページ
        - if @path.is('users#edit')
          %li
            = icon 'fas', 'chevron-right'
          %li
            = link_to "マイページ", user_path(@user)
          %li
            = icon 'fas', 'chevron-right'
          %li
            %p.last プロフィール
        - if @path.is('addresses#edit')
          %li
            = icon 'fas', 'chevron-right'
          %li
            = link_to "マイページ", user_path(@user)
          %li
            = icon 'fas', 'chevron-right'
          %li
            %p.last 住所変更
        - if @path.is('users#credit')
          %li
            = icon 'fas', 'chevron-right'
          %li
            = link_to "マイページ", user_path(@user)
          %li
            = icon 'fas', 'chevron-right'
          %li
            %p.last 支払い方法
        - if @path.is('users#logout')
          %li
            = icon 'fas', 'chevron-right'
          %li
            = link_to "マイページ", user_path(@user)
          %li
            = icon 'fas', 'chevron-right'
          %li
            %p.last ログアウト
        - if @path.is('searches#index')
          %li
            = icon 'fas', 'chevron-right'
          %li
            %p.last
              = "#{@keyword}"
```

ページごとにリストを作っているので、やっぱりコードが長くなってしまいました。
また、categories#showが３つあったので、それぞれ条件を足しています。

# まとめ
次回からはgemを使おうと思います。

ただ、「コントローラー#アクション」であるかを確かめるメソッドはどこかで役に立つときがきそうです。

参考
https://qiita.com/toduq/items/a9fa48926b060b2d8a5b