link_toに死ぬほど苦しめられた私。
仲良くなるためにきちんと向き合って勉強してみました。
link_toとは
Railsのヘルパーの一つ。HTMLで言うaタグに当たる。
その名の通り、どこかにリンクを飛ばしたい時に使うことができる。
Railsでは、HTMLのタグを使うよりもより簡潔に書くことのできるヘルパーというものがいくつか存在する。
似たようなものにform_forやform_tagなど。
これらを使用することで、HTMLタグよりもよりデータベースとの結びつきが簡単なリンクを作ることができる
=Ralisなどサーバーサイド言語によるアプリ開発では重宝される。
aタグでも書けなくはないが、こういうものは積極的に使っていかなければならない...!
link_toの基本構文
※html.erbを前提に記述しています
最もシンプルな記法は上の通りです。HTMLに変換すると以下の通り
この他に、続けてクラスやHTTPメソッドを指定することもできます。
”表示名””推移させたいアドレス”とありますが、これらは全て引数になります。
(Railsでは引数を渡す時に()を省略できるので、ここでは省略されているんだな〜)
左から第一引数、第二引数と数えられ、第一引数にはリンクの表示、第二引数にはURLが入ります。
クラスやHTTPメソッドを追記する場合はこのように書きます。
ちなみに、link_toではデフォルトのHTTPメソッドがgetなので
メソッドを指定するのは基本的にget以外のHTTPメソッドを使用する時のみです。
指定するリンク先
「どこに推移させるか」を指定する部分ですが、いくつか書き方があります。
- 外部リンクを直接記述する
- 相対パスで指定する
- Prefixで指定する
1.外部リンクを直接記述する
そのまんまですね。
これは基本的にアプリケーション内の画面推移には使用されなくて、外部サイトに飛びたい時によく使われます。
別に内部のサイトに飛ぶ時に使用しても飛ぶことは飛びますが、可読性に欠けるのであまり使用されないのかと。
2.相対パスで指定する
ここから先は、アプリケーション内で推移させたい時によく使います。
そして、記述するパスを参照するためにはターミナルでrake routesコマンドを打って確認します。
rake routesコマンドを実行すると、そのアプリケーションで現在設定されているルーティング一覧を見ることができます。
大きく分けて左から縦に4エリアに区切られますが、
左から
Prefix HTTPメソッド 相対パス コントローラー#アクション名
の順番で書かれています。
edit_user GET /users/:id/edit(.:format) users#edit
実際に書くとこのようになります。
:idの部分はそのまま書いてもうまく飛びません。ここでは関連するモデルのidを指定する必要があるので、上のように記述します。
文字列の中でRubyの値を出す必要があるので、#{}で囲みます。
(.:format)に関しては何者なのか・なぜ不要なのか調べてないので、今回は飛ばします
3.Prefixで指定する
実際の開発ではこの記法が最も使われることが多いです。
Prefixとは、ルーティングを設定すると自動的に生成されるパスのことで
後ろに_pathをつけることでパスとして使用することができます。
※Prefixでパスを指定する場合は""が不要。
で、私が躓きまくったのがこのあたり。。。
先ほどの例のように、右側の相対パスを見たときに:idが含まれる場合は
Prefixパスの後ろに、引数を渡す必要があります。
こんな感じで。
この引数になにを渡せばいいのかっていうのが毎回難しくて。
基本的にはインスタンス変数になるのだけど、each文の中だと@が抜けて単なる変数になったりとか、
deviseを使っていたらcurrent_userになったりだとか。。
私には相対パスの方が直感的で分かりやすかったんですが、
応用的な学びに入れば入るほど、使われているのはPrefixが多いような気がします。
まだまだ間違えてエラーになってから初めて気が付いたりすることが多いので、
これから徐々に慣れていきたい次第です。