※本サイトで紹介している商品・サービス等の外部リンクには、アフィリエイト広告が含まれる場合があります。
namespace
大規模なプロジェクトだと、コントローラーが数百できることがある
そのときコントローラーをフォルダでわけたら見やすくなる
namespace
とは、URLもコントローラーのディレクトリも変更する
namespace :admins do
resources :articles
end
admins
・・・複数形を使うのが基本
URL | Controller |
---|---|
/admins/articles/:id | admins/articles#show |
/admins/articles | admins/articles#index |
comments
とlike
はAPIを使っているので、わけてみる
routes.rbにて書き換える
namespace :api do
resources :comments, only: [:index, :new, :create]
resource :like, only: [:show, :create, :destroy]
end
↓ URLとコントローラーが変更されている

api_comments_path(GET)の/api/comments(.:format)のformat部分を指定する
→ 「.html」「.json」のどちらでレスポンスを返すのかルール付けられる
- http://localhost:3000/api/comments.html
→ htmlでレスポンスを返す - http://localhost:3000/api/comments.json
→ jsonでレスポンスを返す
api
配下なのですべてjson
で返したい
routes.rbに書き加える
namespace :api, defaults: {format: :json} do
resources :comments, only: [:index, :create]
resource :like, only: [:show, :create, :destroy]
end
↓ {:format=>:json}
が追加されている

URLの先頭にapi
がつき、article_id
がなくなってしまっている
このままでは記事の特定や取得ができない(コントローラーはこのままで問題ない)
今度はURLだけ変えてみる(scopeに続く)
scope
scope
はURLのみ変更する
scope :admins do
resources :articles
end
URL | Controller |
---|---|
/admins/articles/:id | articles#show |
/admins/articles | articles#index |
先ほどarticle_id
がなくなってしまったので、URLのみ変更する
namespace :api, defaults: {format: :json} do
scope '/articles/:article_id' do
resources :comments, only: [:index, :create]
resource :like, only: [:show, :create, :destroy]
end
end
↓ コントローラーは変わらず、URLだけ変更された
(article_id
が追加されたので、記事の特定・取得が可能になった)

「handle_heart.js」「article.js」のファイルでURLを修正する
`/articles/`
→ `/api/articles/`
先ほど変更したコントローラーについて、
apiディレクトリの中のcomments(likes)コントローラーになるように直す
- controllers/apiのフォルダ(ディレクトリ)を作る
- その中にまず、/application_controller.rbを作る
class Api::ApplicationController < ApplicationController
end
Apiに関わるメソッドで、配下のファイルにも一括で継承させたいときはこちらに書いておく
このときの「Api
」の部分もnamecpaceという(先ほどのnamespaceとは違う意味らしい)
ディレクトリ名がapiなので、Api::
と書いていくこと

comments(likes)_controller.rbをともに
apiの中に引っ張って移動させちゃう
- どちらも、
Api::
のCommentsController(LikesController)と書く - 継承元も
Api::ApplicationController
と書く
class Api::CommentsController < Api::ApplicationController
class Api::LikesController < Api::ApplicationController
- Apiディレクトリ内のすべてのファイルに適用させたい、特有のメソッドがあるとき
- controllers/api/application_controller.rbに書く
- それを継承させたいので、CommentsController(LikesController)ともに
- 継承元は
Api::ApplicationController
になる
module
module
はコントローラーのみ変更する
scope module :admins do
resources :articles
end
URLを変更するとユーザーに見えてしまう → コントローラーだけ変更したら見えない
URL | Controller |
---|---|
/articles/:id | admins/articles#show |
/articles | admins/articles#index |
ログインしないと使えないアクションは「before_action :authenticate_user!
」を忘れると厄介である
- ログインしていないのに個人情報が見えちゃう
- バグ発生の原因になる など
その対策として、ログインしないと使えないcontrollerをまとめた「apps」というディレクトリを作る
- controllers/appsのフォルダ(ディレクトリ)を作る
- その中にまず、/application_controller.rbを作る
before_action :authenticate_user!
を書く
class Apps::ApplicationController < ApplicationController
before_action :authenticate_user!
end
routes.rbで書き換える
scope module: :apps do
resources :favorites, only: [:index]
resource :profile, only: [:show, :edit, :update]
resource :timeline, only: [:show]
end
あわせて、viewでもフォルダを作成する


appsの中に引っ張って移動させちゃう
URLはユーザーから見える部分
- 「apps」が出てきたりなくなっていたりするのはキレイじゃない
- ユーザーに関係のないものは見えなくてもいいんじゃないか
ということで、namespace
ではなくmodule
でコントローラーのみ変更してみた
#DAY12