LoginSignup
17
21

More than 3 years have passed since last update.

【Rails】link_to でPrefix pathへの複数idの渡し方

Posted at

はじめに

Railsではlink_toというヘルパーメソッドが用意されており、これを使えばリンクの作成がとても簡単に実装できます。

動的なリンクを作成する場合には、idを適切に渡してあげる必要があるのですが、その書き方について書いていこうと思います。
 idがひとつだけの場合は全く悩むことはないのですが、2つ以上ある場合はどうすればいいの?って思う方もいるかと思うので参考になれば幸いです。

先に今回扱うアプリの概要(動作)を載せておきます。

54535a5bee0b6c93b58bb929235f0fb2.gif
投稿詳細へのリンク、投稿に対するコメントの削除リンクに飛んでいます。

link_toの書き方

まずはlink_toの書き方から確認しましょう。いろいろな書き方があるかと思いますが、ここではprefix pathでの記述とします。(書くのが楽なので個人的にはprefixをオススメします)

hamlファイル
  = link_to "リンクの表示名", prefix_path(渡すid), httpメソッドの指定(必要な場合)

  -# もしくは以下
  = link_to prefix_path(渡すid), httpメソッドの指定(必要な場合) do
    "リンクの表示名"

例えばprefix pathがpost_pathでhttpメソッドがdeleteの場合は以下のように書けます。

hamlファイル
  = link_to "削除", post_path(post.id), method: :delete

link_toはデフォルトのhttpメソッドがGETなので、GETのリンクの場合はメソッドの指定が不要となります。

Prefix_path と httpメソッドについて

いまいち理解できていない人のために一応書いておきます。

アプリのディレクトリにいる状態でターミナルにrails routesと入力するとルーティングの一覧を見ることができます。
7b4835442b00e360b29a706b75b85632.png
一番上の行を見てみると、左から順にPrefix、Verb、URI Pattern、Controller#Actionと書かれていると思います。

Prefixの列に書かれてあるものに「_path」をつけるたものがPrefix_path、Verbの列にあるものがhttpメソッドだと思ってください。

これらを指定することでどのコントローラのどのアクションを動作させるかを決めることができます。

複数idとはどんな状況か

link_toに複数のid情報を渡す必要があるのはどんなときでしょうか?

それはルーティングがネストされてる状況です。

冒頭で出したアプリの例だと、コメントは投稿内容に紐づくモデルのため、コメントのルーティングは投稿の情報を持っている必要があります。routes.rbファイルとルーティングは次のようになっています。

routes.rb
  resources :posts do
    resources :comments, only: [:create, :destroy]
  end

fa05488af695912b6f16a688608540f1.png

ルーティングのURIパターン(真ん中)を見てみると、削除のURI(2行目)にはpost_idとidが書かれています。これが複数idをlink_toに渡す必要がある状況です。

ではどのように記述するか

特に難しいことはなく、渡すidを2つ書くだけです。
順番はURIパターンに登場するものを左から(親のidから)順に書きます。
例えば今回のコメント削除のリンクであれば以下のようになります。

hamlファイル
  = link_to "削除", post_comment_path(@post.id, @comment.id), method: :delete

idはインスタンス変数などを用いて適切な記述をすればOKです。

最後に

今回はidが2つの例で説明しましたが、3つ以上でも同じことをするだけです。
Prefix pathでの書き方は最初は慣れないかもしれませんが、慣れれば楽にコーディングできるので怖がらず積極的に使ってみましょう!

最後までご覧いただきありがとうございました。

17
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
21