在Rails中组织Controller目录(3)

时间:2011-07-20 23:14:57

标签: ruby-on-rails ruby ruby-on-rails-3

我正在开发一个主要是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

1 个答案:

答案 0 :(得分:0)

如果您正在寻找REST API的版本,可以使用restful_route_version gem。它还负责从另一个版本继承一个版本,这样就不会为每个版本重写相同的REST API。