大ちゃんの駆け出し技術ブログ

RUNTEQ受講生のかわいいといわれるアウトプットブログ

【Rails】resources と resource

こんにちは!大ちゃんの駆け出し技術ブログです。

今回は初心に戻って、基礎編で学習したresourceresourcesの違いについてアウトプットします。

resources

Ruby on Railsでルーティングを行う際に必ず使うであろうresourcesresourcesはモデルに対してアプリケーションにおける基本メソッド7つを自動的にルーティングしてくれます。

例えばUserモデルに対してresourcesを使ってルーティングを記載した場合

Rails.application.routes.draw do
  resources :users
end

$ rails routesでルーティングを表示させると以下のようになります。

$ rails routes
   Prefix Verb   URI Pattern              Controller#Action
    users GET    /users(.:format)                    users#index                                               
          POST   /users(.:format)                    users#create                                                     
 new_user GET    /users/new(.:format)                users#new                                                  
edit_user GET    /users/:id/edit(.:format)           users#edit                                                   
     user GET    /users/:id(.:format)                users#show                                                 
          PATCH  /users/:id(.:format)                users#update                                           
          DELETE /users/:id(.:format)              users#destroy

このようにして、たった1行記載するだけで、簡単にルーティングをしてくれます。

ただ、resourcesが使われるのは基本的にモデルに複数のリソースがある時です。 例えば、Userモデルにはアプリケーションのユーザのモデルがたくさん登録されると思います。 他にも、ユーザの投稿モデルであるPostモデルも、アプリケーション内に複数の投稿が存在するので、resourcesを使用することができます。

resource

では、複数リソースに対してではなく単数のリソースにルーティングする場合はどうでしょうか?

単数のリソースとはつまり、アプリケーション内のページにおいて、ログインユーザだけが使用するリソースです。 例えば、Instagramの設定にあるプロフィールページは自分だけが使用できますよね? 他の人はあなたのプロフィール設定ページににアクセスすることはできません。(できたらアカウントが乗っ取られてしまいます。笑)

そのような単一リソースに対してルーティングを設定する際はresourcesではなく、単数形resourceを使います。 例えば、プロフィール画面をルーティングするとしましょう。

Rails.application.routes.draw do
  resources :users
  # 追記
  resource :profile
end
$ rails routes
      Prefix Verb   URI Pattern               Controller#Action
 new_profile GET    /profile/new(.:format)             profiles#new
edit_profile GET    /profile/edit(.:format)            profiles#edit
     profile GET    /profile(.:format)                 profiles#show
             PATCH  /profile(.:format)                 profiles#update
             DELETE /profile(.:format)                 profiles#destroy
             POST   /profile(.:format)                 profiles#create

resourcesと何かが違いますね、、。

①indexアクションがない

なぜ?、と思うかもしれませんが、これはよくよく考えてみると簡単です。

上述したように、resourceを使用する場合、単一リソースが使用対象をなることを説明しました。 しかし、indexアクションはモデルのリソース全てを表示することを意図しています。 結果、単一リソースであるプロフィール画面を扱う際に複数を表示するindexアクションは不要となるわけです。

②:idがない

4つのアクション(edit、show、update、destroy)から:idという部分が消えています。

実はこれもindexアクションがない理由と同じになります。

resourcesにおいて4つのアクションに:idが必要だった理由は、複数あるリソースの中からどのリソースかを指定するためです。 例えば、自分の投稿を編集する場合、どのidの投稿かを指定しないと、どの投稿を編集していいのかがわかりません。投稿の詳細閲覧、投稿の更新、投稿の削除も同様に、どの投稿であるかを指定しないといけません。

しかし、プロフィール設定画面はどうでしょうか。 単一リソースであるプロフィールは、指定せずとも一つしかないのだからわかるという仕組みです。 ですので、idを指定する必要がそもそもないという理由で:idが消えています。

終わりに

1つのアプリケーションを作成する中で単一リソースを使う頻度はそこまで多くありません。 しかし、プロフィール画面などはアプリケーションによく使われるので、念のため違いについては今一度再確認しておきましょう。

以上、大ちゃんの駆け出し技術ブログでした!