【Rails】resources と resource
こんにちは!大ちゃんの駆け出し技術ブログです。
今回は初心に戻って、基礎編で学習したresource
とresources
の違いについてアウトプットします。
resources
Ruby on Railsでルーティングを行う際に必ず使うであろうresources
。
resources
はモデルに対してアプリケーションにおける基本メソッド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つのアプリケーションを作成する中で単一リソースを使う頻度はそこまで多くありません。 しかし、プロフィール画面などはアプリケーションによく使われるので、念のため違いについては今一度再確認しておきましょう。
以上、大ちゃんの駆け出し技術ブログでした!