【Rails】絶対理解できる!検索機能のransack【ransackこれから覚える人に届け!】

# ransackとは
様々な'モデルテーブルのカラム（縦列）'を用いて、様々な'検索'が出来ます。
検索機能としてよく使われているので、お使いの際はインストールしてください。
こちらでは理解する事を目標にしているのでインストールは他の記事読んでください。
他の皆様の記事はこれに装飾したり他の機能を組み込んだりして、
ノイズ混じりで説明してくれています。
これは純度100%のransack記事です。
自分が調べるときこういうの誰か書いとけよって思った内容です。
## controllerの書き方
```ruby
    def index
        @q = モデル.all.ransack(params[:q])
        @モデル = @q.result
    end
```
index下で一番簡潔に書くとこうだと思います。
@モデル = モデル.allがこうなります。
これをめちゃめちゃ分かりやすく説明します。
日本語訳します。
@qと:qのqはquery(質問)の略で、paramsは見つけてくるメソッド、
ransackは盗む、resultは結果、=は定義するという意味ですので、
@q = モデル.all.ransack(params[:q])は
@質問(@q)を'質問([:q])を見つけてきて(params)全てのモデル(モデル.all)から盗むんだもの(ransack)'と定義(=)します。
@モデル = @q.resultは
@モデル(@モデル)を@質問(@q)の結果(result)と定義(=)します。
つまり、
@質問を'質問を見つけてきて全てのモデルから盗むんだもの'と定義します。
そして、
@モデルを"@質問の結果"と定義します。
と書いてます。
英語だと分からなくなるけど日本語も添えられると分かりやすくないですか？
@質問を代入して、
@モデルを"'質問を見つけてきて全てのモデルから盗むんだもの'と定義します。の結果"と定義します。

元の@モデル=モデル.allと合わせて綺麗に日本語訳してみましょう。
@モデルを'全てのモデル'と定義する。から、
@モデルを"'質問を見つけてきて全てのモデルから選別して取ってきたもの'の結果"と定義します。
と書き換えたわけですね。

しのごの言わずにこうやって説明してくれれば良くないですか？

## viewの書き方
erbで書いた版↓
```erb
<%= search_form_for @q, url: ウラル do |f| %>
  <%= f.search_field :カラム_or_カラム_検索のしかた %>
  <%= f.submit 'なんか文字' %>
<% end %>
```
slimで書いた版↓
```slim
= search_form_for @q, url: ウラル do |f|
    = f.search_field :カラム_or_カラム_検索のしかた
    = f.submit 'なんか文字'
```
#### search_form_forメソッド
endで閉じてその中の条件を使って検索してくれます。
カタカナのウラル(説明は↓の'カタカナの箇所'で説明します。)
以外は基本そのままだと思います。
search_form_for @qは、日本語訳すると検索_形_ために@質問
@質問を検索するための形式って感じですね。

※ここ難しい
それを検索するために飛ぶurlの指定をしてしてます。
今回だと検索画面indexで使っているんでまたindexに飛ばしています。
なら飛ばさなくて良くない？って思いますよね。
こういう検索のやつってずーとひっついていて右上とかにないですか？
他の画面からだとindexに飛ばさなきゃいけないですよね。
それにindexにある場合でも一回飛ばさないとcontroller通らないですよね。
だからurlの指定は絶対いるんです。

※ここ簡単
doは行うって意味ですね

※ここ難しい
|f|はsearch_form_forメソッドがendで閉じるまでにf.とつけてくれれば、
それがsearch_form_forメソッドの内容としますよって事です。
つまり、その後の二つのメソッド、search_fieldとsubmitは
search_form_forメソッドの内容とするためにf.がついています。
これがついていないと検索できないって事です。
|form|とかで説明している人もいますよね。|f|は省略形です。
|form|だったら、search_form_forメソッドの内容とするためにform.がつくって事です。
↑これはじめの方にみんななんじゃこれってなるのに、
　説明してくれてないの親切じゃないですよね。

※ここ難しい
この@qは実際検索した言葉です。翻訳的にいうと、質問した言葉のことです。
controllerの@qだけじゃなくてparams[:q]の:qにも入ります！
@q = モデル.all.ransack(params[:q])これを見ながら考えてください。
例えばuntyokoと検索するなら、@qと:qにuntyokoが入り、日本語訳すると
untyoko(@untyoko)を'untyoko(:untyoko)を見つけてきて全てのモデルから盗むんだもの'と定義します。
ということです。ここはしっかり文章を日本語訳出来ると分かると思います。

#### search_fieldメソッド
検索_場所、分かりやすいですよね。
検索する場所って感じです。
カタカナのカラムと検索のしかたは↓の'カタカナの箇所'の箇所で説明します。
#### submitメソッド
伝える、分かりやすいですよね
まあ送信ですね。
なんか文字は↓の'カタカナの箇所'で説明します。


#### カタカナの箇所
url: ulrとか、title_or_body_contとか検索とかにすると、
そのままコピペで使ってエラー出て混乱する人がいるかも知れないので、カタカナで書きました。
ウラルのところにはindexでつける場合は モデルs_path です。
検索しているviewのPrefixを書いてください。
カラムはモデルテーブルの列のことです。
idのみで検索したい時は'id_検索のしかた'です。
idか、titleで検索したい時は'id_or_title_検索のしかた'です。
もちろん'検索のしかた'って本当に書かないでください。
'検索のしかた'のところには、その言葉が入っていれば検索に引っ掛かるように出来たり、完全に一致しないと検索に引っかからないようにできたりする単語が入ります。
それをpredicateって言いますので、どんなのがあるか気になったら検索してみてください。
よく使うのが、その言葉が入っていれば検索に引っ掛かるようにできる単語でcontです。
何も指定がなければ、'検索のしかた'はcontを入れましょう。
'なんか文字'は検索のボタンのところなので'検索'でいいと思います。

分からないとこありました？
これで完成です。例も載せておきます。
## 例:モデルテーブルがuserでviewがindex、nameとidでその言葉が入っていれば検索できる。送信ボタンは検索
controller
```ruby
    def index
        @q = User.all.ransack(params[:q])
        @user = @q.result
    end
```
erbで書いた版↓
```erb
<%= search_form_for @q, url: users_path do |f| %>
  <%= f.search_field :name_or_id_cont %>
  <%= f.submit '検索' %>
<% end %>
```
slimで書いた版↓
```slim
= search_form_for @q, url: users_path do |f|
    = f.search_field :name_or_id_cont
    = f.submit '検索'
```