8

我的模块名称和文件夹结构有问题。

我有一个模型定义为

module API
  module RESTv2
    class User
    end
  end
end

文件夹结构看起来像

models/api/restv2/user.rb

尝试访问该类时,出现未初始化的常量错误。但是,如果我将模块名称更改为 REST 并将文件夹更改为 /rest,我不会收到错误消息。

我认为问题与文件夹的命名有关,并且我尝试了 /rest_v_2、/rest_v2、/restv_2 等的所有不同组合。

有什么建议么?

4

2 回答 2

10

Rails在模块或类名上使用“下划线”方法来尝试找出当遇到一个它还不知道的常量时要加载的文件。当你通过这种方法运行你的模块时,它似乎并没有给出最直观的结果:

"RESTv2".underscore
# => "res_tv2"

我不确定为什么下划线会做出这个选择,但我敢打赌,将您的模块目录重命名为上述将解决您的问题(尽管我认为我更愿意将其重命名为“RestV2 或 RESTV2,这样目录名称才合理)。

于 2013-06-17T14:39:40.120 回答
5

您需要将 Rails 配置为在 app/model 目录的子目录中自动加载。把它放在你的 config/application.rb 中:

config.autoload_paths += Dir["#{config.root}/app/models/**/"]

然后你应该能够自动加载这些文件。

此外,您可能的文件名必须是 app/model/api/res_tv2/user.rb,因为 Rails 使用 String.underscore 来确定文件名。我只是将其称为 API::V2::User 以避免头痛,除非您拥有不止一种类型的 API。

于 2013-06-17T14:34:28.400 回答