ルーティングに対するアクションの変更方法 Rails

プログラミング
スポンサーリンク

概要

どの記事にコメントするのか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 :articlesresources :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
.

になる形を作る事ができた。
.

参考文献

関連記事

コメント

タイトルとURLをコピーしました