箱のプログラミング日記。

渋谷の自社開発企業でRails書いてます。

link_toと仲良くなりたい

f:id:y_hakoiri:20191102121704j:plain

link_toに死ぬほど苦しめられた私。

仲良くなるためにきちんと向き合って勉強してみました。

 

link_toとは

Railsのヘルパーの一つ。HTMLで言うaタグに当たる。

その名の通り、どこかにリンクを飛ばしたい時に使うことができる。

 

Railsでは、HTMLのタグを使うよりもより簡潔に書くことのできるヘルパーというものがいくつか存在する。

似たようなものにform_forやform_tagなど。

これらを使用することで、HTMLタグよりもよりデータベースとの結びつきが簡単なリンクを作ることができる

=Ralisなどサーバーサイド言語によるアプリ開発では重宝される。

 

aタグでも書けなくはないが、こういうものは積極的に使っていかなければならない...!

 

link_toの基本構文

<%= link_to "表示名", "推移させたいアドレス" %>

※html.erbを前提に記述しています

 

最もシンプルな記法は上の通りです。HTMLに変換すると以下の通り

<a href="推移させたいアドレス">表示名</a>

 

この他に、続けてクラスやHTTPメソッドを指定することもできます。

”表示名””推移させたいアドレス”とありますが、これらは全て引数になります。

(Railsでは引数を渡す時に()を省略できるので、ここでは省略されているんだな〜)

左から第一引数、第二引数と数えられ、第一引数にはリンクの表示、第二引数にはURLが入ります。

 

<%= link_to "表示名", "推移させたいアドレス", class="class", method: :get %>

クラスやHTTPメソッドを追記する場合はこのように書きます。

ちなみに、link_toではデフォルトのHTTPメソッドがgetなので

メソッドを指定するのは基本的にget以外のHTTPメソッドを使用する時のみです。

 

指定するリンク先

「どこに推移させるか」を指定する部分ですが、いくつか書き方があります。

  1. 外部リンクを直接記述する
  2. 相対パスで指定する
  3. Prefixで指定する

 

1.外部リンクを直接記述する
<%= link_to "グーグル", "https://www.google.com" %>

そのまんまですね。

これは基本的にアプリケーション内の画面推移には使用されなくて、外部サイトに飛びたい時によく使われます。

別に内部のサイトに飛ぶ時に使用しても飛ぶことは飛びますが、可読性に欠けるのであまり使用されないのかと。

 

2.相対パスで指定する

ここから先は、アプリケーション内で推移させたい時によく使います。

そして、記述するパスを参照するためにはターミナルでrake routesコマンドを打って確認します。

f:id:y_hakoiri:20190602213636p:plain

rake routesコマンドを実行すると、そのアプリケーションで現在設定されているルーティング一覧を見ることができます。

 

大きく分けて左から縦に4エリアに区切られますが、

f:id:y_hakoiri:20190602213853p:plain

左から

Prefix HTTPメソッド  相対パス コントローラー#アクション名

の順番で書かれています。

edit_user  GET  /users/:id/edit(.:format)  users#edit

 

<%= link_to "編集", "/users/#{user[:id]}/edit" %>

実際に書くとこのようになります。

:idの部分はそのまま書いてもうまく飛びません。ここでは関連するモデルのidを指定する必要があるので、上のように記述します。

文字列の中でRubyの値を出す必要があるので、#{}で囲みます。

(.:format)に関しては何者なのか・なぜ不要なのか調べてないので、今回は飛ばします

 

3.Prefixで指定する
<%= link_to "編集", edit_user_path(@user) %>

実際の開発ではこの記法が最も使われることが多いです。

 

Prefixとは、ルーティングを設定すると自動的に生成されるパスのことで

後ろに_pathをつけることでパスとして使用することができます。

※Prefixでパスを指定する場合は""が不要。

 

で、私が躓きまくったのがこのあたり。。。

f:id:y_hakoiri:20190602213853p:plain

先ほどの例のように、右側の相対パスを見たときに:idが含まれる場合は

Prefixパスの後ろに、引数を渡す必要があります。

 

<%= link_to "編集", edit_user_path(@user) %>

こんな感じで。

この引数になにを渡せばいいのかっていうのが毎回難しくて。

基本的にはインスタンス変数になるのだけど、each文の中だと@が抜けて単なる変数になったりとか、

deviseを使っていたらcurrent_userになったりだとか。。

 

私には相対パスの方が直感的で分かりやすかったんですが、

応用的な学びに入れば入るほど、使われているのはPrefixが多いような気がします。

 

 

まだまだ間違えてエラーになってから初めて気が付いたりすることが多いので、

これから徐々に慣れていきたい次第です。