教科書で扱われないRails標準の便利コマンド

## 検証の際のRailsのバージョン
`5.1.6`　

## 前提
Rails4系で開発している場合は、各コマンドの`rails 〇〇`のrailsを`rake 〇〇`に変更すればOKで、`rake secret`コマンドについては、Rails４系と５系どちらも関係なく`rake secret` で大丈夫です。


## rails aboutコマンド

現在いるRailsアプリのディレクトリ内での各ライブラリやツールのバージョン情報などを出力するコマンド

```ruby
$ rails about
About your application's environment
Rails version             5.1.6
Ruby version              2.3.8-p459 (x86_64-darwin17)
RubyGems version          2.5.2.3
Rack version              2.0.5
JavaScript Runtime        Node.js (V8)
Middleware                Rack::Sendfile, ActionDispatch::Static, ActionDispatch::Executor, ActiveSupport::Cache::Strategy::LocalCache::Middleware, Rack::Runtime, Rack::MethodOverride, ActionDispatch::RequestId, ActionDispatch::RemoteIp, Sprockets::Rails::QuietAssets, Rails::Rack::Logger, ActionDispatch::ShowExceptions, WebConsole::Middleware, ActionDispatch::DebugExceptions, ActionDispatch::Reloader, ActionDispatch::Callbacks, ActiveRecord::Migration::CheckPending, ActionDispatch::Cookies, ActionDispatch::Session::CookieStore, ActionDispatch::Flash, Rack::Head, Rack::ConditionalGet, Rack::ETag
Application root          /Users/shigeyukifukuda/workspace/rails_tutorial
Environment               development
Database adapter          sqlite3
Database schema version   0
```

## rails runnerコマンド

```ruby
$ bundle exec rails runner ファイル名
```

これを使うことで、runnerコマンドの引数に渡した `.rbファイル` をRails環境(irbと違いRailsのメソッドが使える環境)で実行可能です。 
`gem "pry-rails"` がすでにインストールされている場合は、 `binding.pry` でデバッグすることも可能です。

詳しい使用方法はこちらを参照
https://speakerdeck.com/fuqda/rubyfalsebentimakutesuto

## rails middlewareコマンド

そのリポジトリのコードを追いかける時やgemが依存しているミドルウェアについて調べる時に使えるかも 
(結局gemの場合はgithubのリポジトリのコード読めよ！って話ですが...)

```ruby
$ bundle exec rake middleware　# 実行すると依存しているミドルウェアが一覧でコンソールに表示される
use Rack::Sendfile
use ActionDispatch::Static
use ActionDispatch::Executor
use ActiveSupport::Cache::Strategy::LocalCache::Middleware
use Rack::Runtime
use Rack::MethodOverride
use ActionDispatch::RequestId
use ActionDispatch::RemoteIp
use Sprockets::Rails::QuietAssets
use Rails::Rack::Logger
use ActionDispatch::ShowExceptions
use WebConsole::Middleware
use ActionDispatch::DebugExceptions
use ActionDispatch::Reloader
use ActionDispatch::Callbacks
use ActiveRecord::Migration::CheckPending
use ActionDispatch::Cookies
use ActionDispatch::Session::CookieStore
use ActionDispatch::Flash
use Rack::Head
use Rack::ConditionalGet
use Rack::ETag
run Signapp::Application.routes
```

## rake secretコマンド

任意の暗号化文字列を作ってくれるコマンド 
`secret_key_base`に記載する長文の暗号文字列を生成する際に主に使用する 

```
$ bundle exec rake secret
c72dfbbacdde22240e4ea7e8f6d4297aa1605743c9ba77baeb2f50e59491d01c625fccbdfbdc6dfb9bafc88dbbec7bc8a8c5dafdea724c29f3073e8c0d980721
```

## rake statsコマンド

アプリケーションディレクトリで実行すると現状のアプリの各MVCのコードに関する統計情報をコンソールに表示してくれるコマンドです！
これを使うことでアプリ内の問題点を統計ベースで分析することに役立ちそうです。
下の例はRailsチュートリアル(5.0系)のアプリディレクトリに対して実行した結果になります。
なお、このコマンドについては、Rails4.0系でも5.0系でも`rake stats`で大丈夫な模様です！

```ruby
$ bundle exec rake stats
+----------------------+--------+--------+---------+---------+-----+-------+
| Name                 |  Lines |    LOC | Classes | Methods | M/C | LOC/M |
+----------------------+--------+--------+---------+---------+-----+-------+
| Controllers          |    269 |    231 |       8 |      35 |   4 |     4 |
| Helpers              |     87 |     72 |       0 |      11 |   0 |     4 |
| Jobs                 |      2 |      2 |       1 |       0 |   0 |     0 |
| Models               |    142 |    100 |       4 |      16 |   4 |     4 |
| Mailers              |     16 |     14 |       2 |       2 |   1 |     5 |
| Channels             |      8 |      8 |       2 |       0 |   0 |     0 |
| Javascripts          |     51 |      4 |       0 |       1 |   0 |     2 |
| Libraries            |      0 |      0 |       0 |       0 |   0 |     0 |
| Tasks                |      0 |      0 |       0 |       0 |   0 |     0 |
| Controller tests     |    196 |    160 |       6 |      25 |   4 |     4 |
| Helper tests         |     26 |     22 |       2 |       4 |   2 |     3 |
| Model tests          |    140 |    116 |       3 |      24 |   8 |     2 |
| Mailer tests         |     46 |     36 |       2 |       4 |   2 |     7 |
| Integration tests    |    379 |    321 |       9 |      29 |   3 |     9 |
+----------------------+--------+--------+---------+---------+-----+-------+
| Total                |   1362 |   1086 |      39 |     151 |   3 |     5 |
+----------------------+--------+--------+---------+---------+-----+-------+
  Code LOC: 431     Test LOC: 655     Code to Test Ratio: 1:1.5
```

# 番外編

Rails標準のコマンドとは違うが、おそらくどの会社のRailsアプリでも `Gemfile` には必ず入っているであろう `pry-rails` の便利な仕組み

## show-methodコマンド(主に `pry-rails` でのデバッグ時に有効)

コマンドの引数に渡したメソッドの定義内容と定義されている場所をコンソールに表示してくれます。
下の例ではコマンドの引数に指定したメソッドが`rails_warden`というgemの中に定義されていることがわかります。


`show-method 該当メソッドが記載されているクラス(定義元である必要なし).new.メソッド名`

```ruby
$ show-method SessionsController.new.logged_in?

From: /Users/ユーザー名/アプリ名/vendor/bundler/ruby/2.3.0/gems/rails_warden-0.5.8/lib/rails_warden/controller_mixin.rb @ line 13:
Owner: RailsWarden::Mixins::HelperMethods
Visibility: public
Number of lines: 3

def authenticated?(*args)
  warden.authenticated?(*args)
end
```

こいつの便利ポイントとしては、「このメソッドどこにも定義されてないけど、何だこれ？」と思った時にどのgemに依存しているメソッドなのかを明確にしてくれるのでコードリーディングが捗ることでしょうか。 
(まあ先程同様にgemのコード読めよ！って話ですが)

## 最後に
いかがだったでしょうか？
自分は働き始めてから、これらのコマンドを知りました...
なかなかRailsの本などでも取り上げられることの少ない項目だと思うので、 
読んで下さる方のRails知識のちょっとした足しになれば幸いです。