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"}
ビンゴ!!!