7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Rails】resourcesで設定したCRUDのルーティングヘルパーの表記の仕方

Last updated at Posted at 2020-12-12

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も指定しないとだな」
私の中にはあれ(↓)が浮かんでいます。

config/route.rb
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の設定は終わってます〜」
私:「えっ」

config/route.rb
Rails.application.routes.draw do
〜略〜
  resources :posts
end

resources :posts(今回は投稿に関するものなのでpostsとします)の一行で、コントローラのindexshowneweditcreateupdatedestroyアクションの宣言が完了してしまいます。
参照リンク:Railsガイド★2.リソースベースのルーティング
Progateには確かその説明はなかったので驚きました。

3.2ルーティングヘルパーについて

〜プルリク後のコードレビューにて〜
Aさん:「パスの書き方ですが、基本的にはルーティングヘルパーを使ってもらった方が良いかと思います」
私:「えっ」
 ・・そうです、またまたあれを浮かべてコードを書いていました。

app/views/posts/show.html.erb
<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用ヘルパー

app/views/posts/show.html.erb
<div class="post-menus">
  <%= link_to("編集", "/posts/#{@post.id}/edit") %>
  <%= link_to("削除", "/posts/#{@post.id}/destroy", {method: "post"}) %>
</div>

app/views/posts/show.html.erb
<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.まとめ

他のアクションと一緒にまとめてみます。

matome.erb
<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``destroypost_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.最後に

記事の感想や意見、ご指摘等あれば伝えていただけるとありがたいです。
読んでいただき、ありがとうございました。

7
1
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
7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?