railsでgrapeを使ってAPIを作成しているのですが、V1,V2二つのAPIのうちV2だけがルーティングに反映されません。
エラーも出ていないのでどうすれば良いかわからず困っています。
v1はdeviseの認証に関する部分です。
v2はその他のAPIです。
ruby
1config/routes.rb 2Rails.application.routes.draw do 3 #mount_devise_token_auth_for 'User', at: 'auth' 4 # standard devise routes available at /users 5 # NOTE: make sure this comes first!!! 6 devise_for :users 7中略 8 namespace :apis do 9 namespace :api do 10 mount_devise_token_auth_for 'User', at: '/v1/auth' 11 mount API::Root => '/' 12 end 13 # token auth routes available at /api/v1/auth 14 end 15end
ルーティングはこのような記述です。
ファイル構成は
このような感じです。
ruby
1apis/api/v2/root.rb 2module API 3 module V2 4 class Root < Grape::API 5 version 'v2', using: :path 6 format :json 7 8 mount API::V2::Users 9 mount API::V2::Notes 10 mount API::V2::Comments 11 mount API::V2::Replies 12 end 13 end 14end
ruby
1apis/api/v1/root.rb 2module API 3 module V1 4 class Root < Grape::API 5 version 'v1', using: :path 6 format :json 7 8 class ApplicationController < ActionController::API # Note: here is not ::BASE 9 include DeviseTokenAuth::Concerns::SetUserByToken 10 end 11 12 auth :grape_devise_token_auth, resource_class: :user 13 helpers GrapeDeviseTokenAuth::AuthHelpers 14 15 desc 'GET apis/api/v1/test' 16 get 'test' do 17 authenticate_user! 18 { 19 message: 'test', 20 current_user_uid: current_user.uid, 21 authenticated?: authenticated?, 22 } 23 end 24 end 25 end 26end
ruby
1apis/api/root.rb 2module API 3 class Root < Grape::API 4 GrapeDeviseTokenAuth.setup! do |config| 5 config.authenticate_all = true 6 end 7 prefix 'api' 8 mount API::V1::Root 9 mount API::V2::Root 10 end 11end
またv2モデルのファイルはcomments.rbを例に出すとこのような感じです。
ruby
1api/api/v2/comments.rb 2module API 3 module V2 4 class Comments < Grape::API 5 resources :comments do 6 7 desc 'Create a comment' 8 params do 9 requires :id, type: Integer 10 requires :text, type: String 11 requires :note_id, type: Integer 12 end 13 post "/" do 14 @comment=Comment.create(text: params[:text],note_id: params[:note_id]).merge(user_id: current_user.id) 15 end 16 17 desc 'Edit a comment' 18 params do 19 requires :id, type: Integer 20 end 21 get '/:id/edit' do 22 @comment=Comment.find(params[:id]) 23 end 24 25 desc 'Update a comment' 26 params do 27 requires :id, type: Integer 28 requires :text, type: String 29 requires :note_id, type: Integer 30 end 31 patch '/:id' do 32 if current_user 33 comment=Comment.find(params[:id]) 34 comment.update(text: params[:text],note_id: params[:note_id]).merge(user_id: current_user.id) 35 end 36 end 37 38 desc 'Delete a comment' 39 params do 40 requires :id, type: Integer 41 end 42 delete '/:id' do 43 @comment=Comment.find(params[:id]) 44 if @comment.user_id == current_user.id 45 @comment.destroy 46 end 47 end 48 49 private 50 def comment_params 51 requires :id, type: Integer 52 requires :text, type: String 53 requires :note_id, type: Integer 54 end 55 end 56 end 57 end 58end
また、ファイルの読み込みに関するapplication.rbの記述は以下です。
ruby
1config/application.rb 2 3module Tradenote 4 class Application < Rails::Application 5 # Initialize configuration defaults for originally generated Rails version. 6 config.load_defaults 5.2 7 config.i18n.default_locale = :ja 8 config.assets.initialize_on_precompile = false 9 config.paths.add File.join('app', 'apis'), glob: File.join('**', '*.rb') 10 config.autoload_paths += Dir[Rails.root.join('app', 'apis', '*')] 11 end 12end
このようなコードで書いているのですが、
rake routes とすると、
画像のようにv2に関するルーティングが完全に無視されてしまいます。
どう対応すれば良いでしょうか?
ご教授いただければ幸いです。
ご対応の方よろしくお願い申し上げます。
あなたの回答
tips
プレビュー