rails routes コマンドの出力結果を見やすく直す

## 概要
rails で Web アプリケーションを作っている、という前提で本日の話です。

Web アプリケーションの開発中は `rails routes` コマンド等で現在のルーティング一覧を確認することがちらほらあるかと思います。(いや、私はブラウザで見てます、という方はブラウザバックでｗ)


[* `rails routes` についてはこちらをご参照ください](https://railsguides.jp/routing.html#%E6%97%A2%E5%AD%98%E3%81%AE%E3%83%AB%E3%83%BC%E3%83%AB%E3%82%92%E4%B8%80%E8%A6%A7%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B)



その際、出力結果はこんなかんじの内容が出力されます。(※横に長いのでPC閲覧推奨)

```
                   Prefix Verb     URI Pattern                                                                                    Controller#Action
         new_user_session GET      (/:locale)/users/sign_in(.:format)                                                             users/sessions#new {:locale=>/en/}
             user_session POST     (/:locale)/users/sign_in(.:format)                                                             users/sessions#create{:locale=>/en/}
     destroy_user_session DELETE   (/:locale)/users/sign_out(.:format)                                                            users/sessions#destroy {:locale=>/en/}
        new_user_password GET      (/:locale)/users/password/new(.:format)                                                        users/passwords#new {:locale=>/en/}
       edit_user_password GET      (/:locale)/users/password/edit(.:format)                                                       users/passwords#edit {:locale=>/en/}
            user_password PATCH    (/:locale)/users/password(.:format)                                                            users/passwords#update {:locale=>/en/}
                          PUT      (/:locale)/users/password(.:format)                                                            users/passwords#update {:locale=>/en/}
                          POST     (/:locale)/users/password(.:format)                                                            users/passwords#create {:locale=>/en/}
 cancel_user_registration GET      (/:locale)/users/cancel(.:format)                                                              users/registrations#cancel {:locale=>/en/}
    new_user_registration GET      (/:locale)/users/sign_up(.:format)                                                             users/registrations#new {:locale=>/en/}
   edit_user_registration GET      (/:locale)/users/edit(.:format)                                                                users/registrations#edit {:locale=>/en/}
        user_registration PATCH    (/:locale)/users(.:format)                                                                     users/registrations#update {:locale=>/en/}
                          PUT      (/:locale)/users(.:format)                                                                     users/registrations#update {:locale=>/en/}
                          DELETE   (/:locale)/users(.:format)                                                                     users/registrations#destroy {:locale=>/en/}
                          POST     (/:locale)/users(.:format)                                                                     users/registrations#create {:locale=>/en/}
```

**<font color="red">……見づらい(　ﾟдﾟ)</font>**　

この感覚、routes コマンドを実行したことある方ならきっとわかってくれるはずです(たぶん)
これをあれこれ加工して見やすくしてみようというのが今回のお話です。

いろいろ手段はありそうなんですが、コマンドで対処している例はあまり見かけなかったので、自分好みの書式にするのも兼ねて記事にしました。

というわけでレッツトライ。

## Step1. 余計なものを消す

表示上は必要なさそうなものを単純に置換で消してみようと思います。

### コマンド
```sh
rails routes |\
sed \
-e 's/(\/:locale)//g' \
-e 's/(.:format)//g' \
-e 's/{:locale=>.*}//g'
```
### 出力結果
```
                   Prefix Verb     URI Pattern                                                                                    Controller#Action
         new_user_session GET      /users/sign_in                                                             users/sessions#new
             user_session POST     /users/sign_in                                                             users/sessions#create
     destroy_user_session DELETE   /users/sign_out                                                            users/sessions#destroy
        new_user_password GET      /users/password/new                                                        users/passwords#new
       edit_user_password GET      /users/password/edit                                                       users/passwords#edit
            user_password PATCH    /users/password                                                            users/passwords#update
                          PUT      /users/password                                                            users/passwords#update
                          POST     /users/password                                                            users/passwords#create
 cancel_user_registration GET      /users/cancel                                                              users/registrations#cancel
    new_user_registration GET      /users/sign_up                                                             users/registrations#new
   edit_user_registration GET      /users/edit                                                                users/registrations#edit
        user_registration PATCH    /users                                                                     users/registrations#update
                          PUT      /users                                                                     users/registrations#update
                          DELETE   /users                                                                     users/registrations#destroy
                          POST     /users                                                                     users/registrations#create
```


これだけでもそこそこすっきりしましたね。

## Step2. 見た目を調整する
左詰め右詰めがバラバラだったり、幅が広すぎたりしてまだいまひとつ見づらい(※個人の感想です)のでもうちょっと手を加えてみます。

### コマンド
```sh
rails routes | \
sed \
-e 's/(\/:locale)//g' \
-e 's/(.:format)//g' \
-e 's/{:locale=>.*}//g' \
-e 's/URI Pattern/URI-Pattern/g' | \
awk -F'Verb|GET|POST|PUT|PATCH|DELETE' '{if(match($1, /^ *$/)){printf "\" %s\n", $0;} else print}' | \
awk '{printf "%-30s %-10s %-40s %-40s\n", $1,$2,$3,$4}'
```
### 出力結果
```
Prefix                         Verb       URI-Pattern                              Controller#Action
new_user_session               GET        /users/sign_in                           users/sessions#new
user_session                   POST       /users/sign_in                           users/sessions#create
destroy_user_session           DELETE     /users/sign_out                          users/sessions#destroy
new_user_password              GET        /users/password/new                      users/passwords#new
edit_user_password             GET        /users/password/edit                     users/passwords#edit
user_password                  PATCH      /users/password                          users/passwords#update
"                              PUT        /users/password                          users/passwords#update
"                              POST       /users/password                          users/passwords#create
cancel_user_registration       GET        /users/cancel                            users/registrations#cancel
new_user_registration          GET        /users/sign_up                           users/registrations#new
edit_user_registration         GET        /users/edit                              users/registrations#edit
user_registration              PATCH      /users                                   users/registrations#update
"                              PUT        /users                                   users/registrations#update
"                              DELETE     /users                                   users/registrations#destroy
"                              POST       /users                                   users/registrations#create
```

**~~意外とめんどかった(心の声)~~**
力技ですがどうにかしました。 <sub>awk の if 文とか初めて使った</sub>
左詰めで各列が揃ってきれいになりましたね(自己満

Prefixが省略されている行は最後の awk 実行時にそこだけ列数が少なくて表示がおかしくなるので `"` を入れて列数の帳尻を合わせています。ただの数合わせなので入れる文字は特になんでもいいんですが **日本語の `〃` と見た目が近い** というだけの理由でわたしはとりあえずダブルクオートで試してみましたｗ

最後の printf の `%-数字` が各列の幅です。お好みや routes の設定状況に応じてこのへんは適当に数字変えて調節してください。

## Step3. 関数にする
```sh:~/.bash_profile
function my_routes() {
  rails routes | \
  grep $1 | \
  sed \
  -e 's/(\/:locale)//g' \
  -e 's/(.:format)//g' \
  -e 's/{:locale=>.*}//g' \
  -e 's/URI Pattern/URI-Pattern/g' | \
  awk -F'Verb|GET|POST|PUT|PATCH|DELETE' '{if(match($1, /^ *$/)){printf "\" %s\n", $0;} else print}' | \
  awk '{printf "%-30s %-10s %-40s %-40s\n", $1,$2,$3,$4}'
}
```
シェルの関数作ったのは初めてなのでそもそもこういう書き方や使い方はいいのかどうかは **相当怪しい** ですが意図通り動くには動きますｗ通りすがりの方、気になる点あればご指摘ください。(マサカリ大歓迎)

ここでは rails routes のあとに grep を追加しました。私の場合は rails routes はだいたい grep とセットで使うことが多いので組み込んでみました。関数の引数に渡したものがこの grep で使われます。alias ではなく関数にしたのはこれがやりたかったがゆえです。


```
$ my_routes registrations
cancel_user_registration       GET        /users/cancel                            users/registrations#cancel
new_user_registration          GET        /users/sign_up                           users/registrations#new
edit_user_registration         GET        /users/edit                              users/registrations#edit
user_registration              PATCH      /users                                   users/registrations#update
"                              PUT        /users                                   users/registrations#update
"                              DELETE     /users                                   users/registrations#destroy
"                              POST       /users                                   users/registrations#create
```

こんなかんじで実行できます。一応これで完成です！


## 言い訳(スキップ可)
grep 入れると１行目のヘッダーがなくなってしまいますね。sed コマンドで挿入してもいいんですが [Mac の sed だと挙動が違ってちょっと面倒そう](https://it-ojisan.tokyo/mac-linux-sed/) なのと、正直 **ヘッダーなくてもそこまでは困らないかな** という気がしたので今回は一旦パスしました。

## 検証環境

- Railsバージョン
  -  5.2.0
- Windows7 Professional
  - GitBash 使用 
- macOS 10.13.6 High Sierra



## 参考
- [awkの出力を揃える](https://hacknote.jp/archives/9939/)
- [rake routesを整形して表示する](http://chikara.posthaven.com/plain-rake-routes-output)
- [シェルスクリプトで関数を利用する](https://qiita.com/kaw/items/034bc4221c4526fe8866)