我正在开发一个主要是API网关的应用程序。期望我们将随着时间的推移开发多个版本的API并且有向后兼容性的兴趣,我希望有一些类似的东西:
http://host.domain.com/apiv1/:token/:module(/:id(:method))
鉴于此,我要做的是在每个API中拥有自己的子路由系统。对于Controller目录中的文件结构,我想要的是类似于以下内容:
/app/controllers/apiv1_controller.rb
/app/controllers/apiv1/module_controller.rb
/app/controllers/apiv1/response_controller.rb
最终还有:
/app/controllers/apiv2_controller.rb
/app/controllers/apiv2/module_controller.rb
/app/controllers/apiv2/response_controller.rb
这分解为我不确定如何使用以下内容调用子目录中控制器内的方法:
return Apiv1::ResponseController.index
给了我:
undefined method `index' for Apiv1::ResponseController:Class
任何线索?此设置是否要求我手动“明确”“需要”必需的文件?
粘贴在这里回答问题:
的routes.rb
AppName::Application.routes.draw do
resources :users
match 'api-v1/:token/:module(/:id(/:method))' => 'apiv1#route'
root :to => "welcome#index"
end
apiv1_controller.rb
class Apiv1Controller < ApplicationController
protect_from_forgery
respond_to :json
def route
Rails.logger.level = 0
logger.info("ROUTE ACTION")
logger.info("params: #{params}")
Apiv1::ResponseController.index(params)
end
end
apiv1 / response_controller.rb
class Apiv1::ResponseController < ApplicationController
protect_from_forgery
respond_to :json
def index(params)
Rails.logger.level = 0
logger.info("INDEX ACTION")
result = {
'success' => true,
'controller' => 'response',
'api' => 'v1'
}
render :json => result
end
end
答案 0 :(得分:0)
如果您正在寻找REST API的版本,可以使用restful_route_version gem。它还负责从另一个版本继承一个版本,这样就不会为每个版本重写相同的REST API。