【Rails・Ruby】知っておくと得するかもしれない小技

#はじめに
初めまして！
Railsのアプリケーションを開発していて、個人的に便利だなと思った小技を紹介していきます。


#1.アノテーションコメント
アノテーションを利用することで、開発中にやり残した事・対応すべき事を忘れないようにメモできます。アノテーションとは注釈、注記といった意味です。
###アノテーションと記載すべき事
TODO ・・・後に追加すべき不足している機能の記載
FIXME・・・修正が必要な壊れたコードの記載
OPTIMIZE・・・パフォーマンスの最適化をすべき箇所の記載
HACK・・・リファクタリングすべき箇所の記載
REVIEW・・・ レビューが必要な箇所の記載

###さっそく使ってみよう

```ruby:hoges_controller.rb
def index
  #TODO: hoge
end

def new
  #FIXME: fuga
end

```
コンソールにて**rails notes**と入力します。


```ruby
#rails notesで抽出できるのはTODO，FIXME，OPTIMIZEのみ
>rails notes

#結果
app/controllers/hoges_controller.rb:
  * [21] [TODO] hoge

app/controllers/hoges_controller.rb:
  * [17] [FIXME] fuga
```
対象ファイル、行数( []の中の数字 )、アノテーション、コメントが出力されます。開発中にやり残した事・対応すべき事を、メモしておくと忘れる事がないので便利です。
<font color="Red">**HACK，REVIEW**</font>などを表示させるには、環境変数 ANNOTATION にnotes:custom タスクを実行し追加します。

```ruby

rails notes:custom ANNOTATION=REVIEW
```


###特定のアノテーションを出力する

```ruby:コンソール
#TODOのみ表示
> rails notes:todo
app/controllers/hoges_controller.rb:
 [7] "hoge"

#FIXMEのみ表示
> rails notes:fixme
app/controllers/hoges_controller.rb:
 [17] fuga
```

#2.reload!
rails cで動作を確認しながらコードを書くことがあります。
コードを変更する度にコンソールを抜け、再びrails cをするのは手間なので、reload!を使います。

```ruby
rails c
#コードの変更
> reload!
Reloading...
=> true
```
なお、reload!実行以前の変数に格納したオブジェクトはリロードされていないので注意する必要があります。


```ruby
> user = User.first
User id: 1, email: "hoge@gmail.com", created_at: "2018-06-18 12:03:15", updated_at: "2018-06-18 12:03:27", name: "hoge", sex: nil, occupation: nil, hobby: nil, comment: nil, more_than_18: true, icon: nil, birthday: nil>
> reload!
Reloading...
=> true
> user
User id: 1, email: "hoge@gmail.com", created_at: "2018-06-18 12:03:15", updated_at: "2018-06-18 12:03:27", name: "hoge", sex: nil, occupation: nil, hobby: nil, comment: nil, more_than_18: true, icon: nil, birthday: nil>
```


#3.source_location
ソースコードのファイル名と行番号を配列で返します。
調査対象のメソッドをいったんMethodオブジェクトに変換し、source_locationメソッドを使うことで定義されている場所を特定できます。

```ruby
> User.method(:new).source_location
=> ["lib/active_record/inheritance.rb", 49]
```

###自作メソッドにも使えます

```ruby
> User.method(:user_search).source_location
=> ["app/models/user.rb", 80]
```
###ライブラリのメソッドにも使えます

```ruby
> User.method(:mount_uploader).source_location
=> ["carrierwave/orm/activerecord.rb", 12]
```
このメソッドどんな処理しているんだろう？って時に定義元を素早く教えてくれるのはすごく便利ですね。
source_locationメソッド以外にもMethodクラスには面白いメソッドがあります。興味あるよって方は[こちら](https://docs.ruby-lang.org/ja/latest/class/Method.html)。

#4.methods
レシーバが持っているメソッドの名前を集めて配列にして返します。

```ruby
> User.methods
=>[:before_remove_for_relationships?,
 :_create_callbacks,
 :before_remove_for_relationships=,
 :after_remove_for_relationships,
 :_update_callbacks,
 :after_remove_for_relationships?,
 :after_remove_for_relationships=,
 :_destroy_callbacks,
```

###sortすることもできます

```ruby
> User.methods.sort
=> [:!,
 :!=,
 :!~,
 :<,
 :<=,
 :<=>,
 :==,
 :===,
 :=~,
 :>,
 :>=,
```

###grepを使い特定のメソッドを取得できる。
例)createを含むメソッド

```ruby
> User.methods.grep(/create/)
 [:_create_callbacks,
 :create_unique_string,
 :_create_callbacks=,
 :_create_callbacks?,
 :before_create,
 :after_create,
 :around_create,
 :create,
 :create!,
 :find_or_create_by!,
 :create_with,
 :find_or_create_by,
 :first_or_create,
 :first_or_create!]
```

#終わりに
お疲れ様でした(^_^)
最後まで読んでいただきありがとうございます。
まだまだ駆け出しなので、疑問点や修正点がございましたら、コメントを頂けると幸いです！

#参考
[rubyリファレンスマニュアル](https://docs.ruby-lang.org/)
[Ruby on Rails 5アプリケーションプログラミング](https://www.amazon.co.jp/Ruby-Rails-5%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E5%B1%B1%E7%94%B0-%E7%A5%A5%E5%AF%9B/dp/4774188832)
[ruby-style-guide](https://github.com/rubocop-hq/ruby-style-guide)