Railsのpathとパラメータのはなし

ほんとに今更なんですが、Railsのpathとパラメータにまつわる学習ができたので覚書として。

blogにcommentするアプリを作ってみたら

viewsファイルで

<%= link_to '削除', blog_comment_path(blog, comment), method: :delete %>

として、コメントの削除リンクをつくり、その時点でのcommentの状態を知りたくて binding.pryで確認したら

 id: 2,
 blog_id: 1,
 content: "コメントです",
 created_at: Fri, 04 May 2018 21:08:30 UTC +00:00,
 updated_at: Fri, 04 May 2018 21:08:30 UTC +00:00

だった。 これは予想通り。
で、削除をクリックして、comments_controllerに飛ばされるパラメータを調べてみると

{"controller"=>"comments", "action"=>"destroy", "blog_id"=>"1", "id"=>"2"}

だった。 commentのidと、関連するblogのidが飛んでくるのはわかるが、
viewsファイルの時にあったcontentがなくなってる! どこで削ぎ落とされたんだ!? (もちろん、idがわかればcontentもわかるので、いいっちゃいいんだが)

pathとパラメータの関係

そこでいろいろ調べた結果、pathが絡んでいることがわかった。 ここの箇所のルーティングは以下の通り。

blog_comment  DELETE  /blogs/:blog_id/comments/:id(.:format)  comments#destroy

ここにあるように、このpathだとidしか扱っていない。
だから、idだけを返してきた。そういう理屈だった。なるへそ〜

blogのパラメータも検証してみた

blogのviewsファイルはこんな感じ。

  <tbody>
    <% @blogs.each do |blog| %>
      <tr>
        <td><%= blog.title %></td>
        <td><%= blog.content %></td>
        <td><%= link_to 'Show', blog %></td>
        <td><%= link_to 'Edit', edit_blog_path(blog) %></td>
        <td><%= link_to 'Destroy', blog, method: :delete, data: { confirm: 'Are you sure?' } %></td>
      </tr>
    <% end %>
  </tbody>

ここでのblogの中身を調べると

 id: 1,
 title: "タイトル",
 content: "内容",
 created_at: Fri, 11 May 2018 20:40:41 UTC +00:00,
 updated_at: Fri, 11 May 2018 20:40:41 UTC +00:00>

だった。
ルーティングは以下の通り。

blog  GET  /blogs/:id(.:format)  blogs#show

続いてShowをクリックしてcontrollerへ飛ばされるパラメータを調べた。
先ほどの理屈が正しければ、idだけが来るはず。

{"controller"=>"blogs", "action"=>"show", "id"=>"1"}

ビンゴ!!!