0.はじめに
ProgateでRuby on Railsを学習していると、URLパターンでの表記(例:新規登録画面→
/posts/new
)で進んでいきます。私はその後共同開発に携わる機会があり、
初めてresouces
の存在とルーティングヘルパーの表記の仕方を学びました。
私のような**「ルーティングヘルパーって何?」**という方に読んで頂ければと思います。
1.読んで欲しい人
・「ルーティングヘルパーって何?」「resourcesって何?」という人
・ProgateでRuby on Railsの学習を終えたての人
2.使用環境
・mac.os バージョン10.15.6
・Ruby 2.5.1
・Rails 5.2.4.4
・psql (PostgreSQL) 12.5
3.resourcesとルーティングヘルパー
3.1 resourcesについて
〜共同開発中〜
私はサイト作成のCRUD処理の一部を担当することになりました。
私:「routeも指定しないとだな」
私の中にはあれ(↓)が浮かんでいます。
Rails.application.routes.draw do
get "posts/index" => "posts#index"
get "posts/new" => "posts#new"
get "posts/:id" => "posts#show"
post "posts/create" => "posts#create"
get "posts/:id/edit" => "posts#edit"
post "posts/:id/update" => "posts#update"
post "posts/:id/destroy" => "posts#destroy"
end
Aさん:「resourcesで設定してあるので、routeの設定は終わってます〜」
私:「えっ」
Rails.application.routes.draw do
〜略〜
resources :posts
end
resources :posts
(今回は投稿に関するものなのでposts
とします)の一行で、コントローラのindex
、show
、new
、edit
、create
、update
、destroy
アクションの宣言が完了してしまいます。
参照リンク:Railsガイド★2.リソースベースのルーティング
Progateには確かその説明はなかったので驚きました。
3.2ルーティングヘルパーについて
〜プルリク後のコードレビューにて〜
Aさん:「パスの書き方ですが、基本的にはルーティングヘルパーを使ってもらった方が良いかと思います」
私:「えっ」
・・そうです、またまたあれを浮かべてコードを書いていました。
<div class="post-menus">
<%= link_to("編集", "/posts/#{@post.id}/edit") %>
<%= link_to("削除", "/posts/#{@post.id}/destroy", {method: :post}) %>
</div>
★link_to
とは
link_to("編集","/posts/#{@post.id}/edit")
(1番目の引数にリンクを設定する文字列、2番目の引数にURLを指定してlink_toメソッドを呼び出すこと)でリンクを作成します。
今回だと<a href ="/posts/#{@post.id}/edit">編集</a>
のaタグが作成されます。
Rubyのコードなので「<%= %>」で囲みます。
ルーティングヘルパーについては、ターミナルで
該当のディレクトリ $ rake routes
とすると一覧を表示してくれます。
~略~
posts GET /posts(.:format) posts#index
POST /posts(.:format) posts#create
new_post GET /posts/new(.:format) posts#new
edit_post GET /posts/:id/edit(.:format) posts#edit
post GET /posts/:id(.:format) posts#show
PATCH /posts/:id(.:format) posts#update
PUT /posts/:id(.:format) posts#update
DELETE /posts/:id(.:format) posts#destroy
表にまとめると以下のようになります。ターミナル上の空欄の部分は上と同様という意味です。
URLパターン | パスをつける | HTTPメソッド | コントローラ名#アクション | 機能 |
---|---|---|---|---|
posts | posts_path | GET | posts#index | 一覧 |
posts | posts_path | POST | posts#create | 登録 |
new_post | new_posts_path | GET | posts#new | 新規登録画面 |
edit_post | edit_posts_path | GET | posts#edit | 編集画面 |
post | post_path | GET | posts#show | 詳細 |
post | post_path | PATCHまたはPUT | posts#update | 更新 |
post | post_path | DELETE | posts#destroy | 削除 |
参照リンク1:link_toメソッドを使ったリンクの作成
参照リンク2:[【Rails入門説明書】routesについて解説]
(https://web-camp.io/magazine/archives/16815)
リンクを参照にルーティングヘルパーに変更します。
参照リンク:Railsガイド★2.3パスとURL用ヘルパー
<div class="post-menus">
<%= link_to("編集", "/posts/#{@post.id}/edit") %>
<%= link_to("削除", "/posts/#{@post.id}/destroy", {method: "post"}) %>
</div>
↓
<div class="post-menus">
<%= link_to "編集", edit_post_path(@post) %>
<%= link_to "削除", post_path(@post), method: :delete %>
</div>
・削除のmethodをpost
からdelete
に変更
もともと、post "posts/:id/destroy" => "posts#destroy"
というルーティングを想定していたためpost
にしていましたが、削除のHTTPメソッドはdelete
なので変更しました。
・idパラメータを@post
にする
削除に関してはid情報を持たせる必要があるので、モデルオブジェクト(今回では@post変数
に格納されている)に変更しました。
4.まとめ
他のアクションと一緒にまとめてみます。
<div class="post-menus">
<%= link_to "一覧", posts_path %>
<%= link_to "登録", posts_path, method: :post %>
<%= link_to "新規登録", new_posts_path %>
<%= link_to "編集", edit_post_path(@post) %>
<%= link_to "詳細", post_path(@post) %>
<%= link_to "更新", post_path(@post), method: :put %>
<%= link_to "削除", post_path(@post), method: :delete %>
</div>
★method: :put
は:method => :put
という表記でも可。
★show``update``destroy
はpost_path
を外し@post
のみでも可。
パスをつける | メソッド | メソッド指定 | id | コントローラ名#アクション | 機能 |
---|---|---|---|---|---|
posts_path | GET | × | × | posts#index | 一覧 |
posts_path | POST | ◎ | × | posts#create | 登録 |
new_posts_path | GET | × | × | posts#new | 新規登録画面 |
edit_posts_path | GET | × | ◎ | posts#edit | 編集画面 |
post_path | GET | × | ◎ | posts#show | 詳細 |
post_path | PATCHまたはPUT | ◎ | ◎ | posts#update | 更新 |
post_path | DELETE | ◎ | ◎ | posts#destroy | 削除 |
5.最後に
記事の感想や意見、ご指摘等あれば伝えていただけるとありがたいです。
読んでいただき、ありがとうございました。