概要
どの記事にコメントするのかURLでわかるように
.
ルーティングを変更する。
.
記事にコメントできるAPIの実装
こちらの実装中に遭遇した事案です。
実装内容
今のルーティングは、
.
POST /v1/articles/comments
.
になっていて
記事にコメントするので、
.
URLを「どの記事にコメントするのか」という
意味がわかるように修正する。
.
POST /v1/articles/:article_id/comments
.
つまりこういう風にすると
指定された article_id の記事に対してコメントできる。
.
コントローラーの階層が
.
v1/articles/commets_controller.rb
なので
.
namespace
を使って調整しています。
.
Rails.application.routes.draw do
namespace :v1 do
mount_devise_token_auth_for "User", at: "auth", controllers: {
registrations: "v1/auth/registrations",
}
namespace :articles do
+ resources :articles do
resources :comments
end
end
end
end
.
URLを「どの記事にコメントするのか」をわかるようにするために
.
resources :articles
配下に
.
resources :comments
を変更。
.
POST /v1/articles/articles/:article_id/comments(.:format)
.
このルーティングだと
.
namespace :articles
と resources :articles
.
があるのでarticles
が被ってしまう。
.
なのでnamespace :articles
を消して、
.
POST /v1/articles/:article_id/comments
.
この形にしてリクエストを送ってみる。
.
Rails.application.routes.draw do
namespace :v1 do
mount_devise_token_auth_for "User", at: "auth", controllers: {
registrations: "v1/auth/registrations",
}
resources :articles do
resources :comments
end
end
end
end
.
すると下記のエラーが出ました。
.
ActionController::RoutingError (uninitialized constant V1::CommentsController
Did you mean? ActionController):
.
namespace :articles
を削除したことにより
.
POST /v1/articles/:article_id/comments
.
に対応するactionが
.
v1/comments#create
.
になっていた。
解決策として対応するactionを
.
v1/comments#create
.
ではなく
.
v1/articles/comments#create
.
に変更する。
.
Rails.application.routes.draw do
namespace :v1 do
mount_devise_token_auth_for "User", at: "auth", controllers: {
registrations: "v1/auth/registrations",
}
resources :articles do
resources :comments, controller: "articles/comments"
end
end
end
.
こうすることで
.
URLがPOST /v1/articles/:article_id/comments(.:format)
.
action がv1/articles/comments#create
.
になる形を作る事ができた。
.
コメント