0

我将所有控制器声明为

class Api::V1::SomeController < Api::V1::ApiController; (...); end

在哪里

class Api::V1::ApiController < ApplicationController; end

我所有的控制器都放在/app/controllers/api/v1/*_controller.rb,ApplicationControllerapp/controllers/application_controller.rb

在开发中一切正常,但我在生产中要求和加载包装在 api 版本控制命名空间中的控制器时遇到问题。

在生产环境(本地或heroku)中,我得到了:LoadError (Unable to autoload constant Api::V1::SomeController, expected /app/app/controllers/api/v1/some_controller.rb to define it):

app/config/environments/production.rb在生产环境中配置和要求版本控制 api的正确方法是什么。

4

1 回答 1

2

我很确定您会通过采用模块化方法来定义所有命名空间类来解决这个问题。例如:

module Api
  module V1
    class SomeController < ApiController
      # ...
    end
  end
end

和:

module Api
  module V1
    class ApiController < ::ApplicationController
      # ...
    end
  end
end

使用这种模式可以消除 Rails 中自动加载的命名空间的歧义。自动加载是一种相当复杂的机制...(而且在开发和生产之间的行为似乎确实不同!)如果您想了解更多内部工作原理,这篇文章非常值得一读。

更新

::in表示“::ApplicationController没有命名空间”或“默认命名空间”。在这种情况下可能不需要该部分,因为您可能只ApplicationController定义了一个常量。

这种方法的不同之处在于它确保 Rails 不会“跳过”你的常量定义,可以这么说。我上面链接的文章通过示例进行了解释。

于 2014-05-26T14:44:13.313 回答