はじめに
Railsではlink_toというヘルパーメソッドが用意されており、これを使えばリンクの作成がとても簡単に実装できます。
動的なリンクを作成する場合には、idを適切に渡してあげる必要があるのですが、その書き方について書いていこうと思います。
idがひとつだけの場合は全く悩むことはないのですが、2つ以上ある場合はどうすればいいの?って思う方もいるかと思うので参考になれば幸いです。
先に今回扱うアプリの概要(動作)を載せておきます。
投稿詳細へのリンク、投稿に対するコメントの削除リンクに飛んでいます。
link_toの書き方
まずはlink_toの書き方から確認しましょう。いろいろな書き方があるかと思いますが、ここではprefix pathでの記述とします。(書くのが楽なので個人的にはprefixをオススメします)
= link_to "リンクの表示名", prefix_path(渡すid), httpメソッドの指定(必要な場合)
-# もしくは以下
= link_to prefix_path(渡すid), httpメソッドの指定(必要な場合) do
"リンクの表示名"
例えばprefix pathがpost_pathでhttpメソッドがdeleteの場合は以下のように書けます。
= link_to "削除", post_path(post.id), method: :delete
link_toはデフォルトのhttpメソッドがGETなので、GETのリンクの場合はメソッドの指定が不要となります。
Prefix_path と httpメソッドについて
いまいち理解できていない人のために一応書いておきます。
アプリのディレクトリにいる状態でターミナルにrails routes
と入力するとルーティングの一覧を見ることができます。
一番上の行を見てみると、左から順にPrefix、Verb、URI Pattern、Controller#Actionと書かれていると思います。
Prefixの列に書かれてあるものに「_path」をつけるたものがPrefix_path、Verbの列にあるものがhttpメソッドだと思ってください。
これらを指定することでどのコントローラのどのアクションを動作させるかを決めることができます。
複数idとはどんな状況か
link_toに複数のid情報を渡す必要があるのはどんなときでしょうか?
それはルーティングがネストされてる状況です。
冒頭で出したアプリの例だと、コメントは投稿内容に紐づくモデルのため、コメントのルーティングは投稿の情報を持っている必要があります。routes.rbファイルとルーティングは次のようになっています。
resources :posts do
resources :comments, only: [:create, :destroy]
end
ルーティングのURIパターン(真ん中)を見てみると、削除のURI(2行目)にはpost_idとidが書かれています。これが複数idをlink_toに渡す必要がある状況です。
ではどのように記述するか
特に難しいことはなく、渡すidを2つ書くだけです。
順番はURIパターンに登場するものを左から(親のidから)順に書きます。
例えば今回のコメント削除のリンクであれば以下のようになります。
= link_to "削除", post_comment_path(@post.id, @comment.id), method: :delete
idはインスタンス変数などを用いて適切な記述をすればOKです。
最後に
今回はidが2つの例で説明しましたが、3つ以上でも同じことをするだけです。
Prefix pathでの書き方は最初は慣れないかもしれませんが、慣れれば楽にコーディングできるので怖がらず積極的に使ってみましょう!
最後までご覧いただきありがとうございました。