Rails模块/文件夹命名约定

KPh*_*sey 6 ruby-on-rails

我遇到了模块名称和文件夹结构的问题.

我的模型定义为

module API
  module RESTv2
    class User
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

文件夹结构如下

models/api/restv2/user.rb
Run Code Online (Sandbox Code Playgroud)

当试图访问该类时,我得到一个未初始化的常量错误.但是,如果我将模块名称更改为REST并将文件夹更改为/ rest,则不会收到错误.

我假设问题与文件夹的命名有关,我尝试了/ rest_v_2,/ rest_v2,/ restv_2等所有不同的组合.

有什么建议?

Dhr*_*ruv 10

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

irb(main):001:0> "RESTv2".underscore
=> "res_tv2"
Run Code Online (Sandbox Code Playgroud)

我不确定为什么下划线做出这个选择,但我打赌将你的模块dir重命名为上面会修复你的问题(虽然我想我更喜欢将它重命名为"RestV2或RESTV2,所以目录名称是理智的).

  • 这实际上非常有意义,它是不遵循惯例的字符串`RESTv2`.假设第一个单词是某种首字母缩略词,如"PIN",第二个单词是大写单词,如"Importer":`PINImporter` =>`pin_importer`,`UUIDGenerator` =>`uuid_generator`,`AESCracker `=>`aes_cracker`,`RESTv2` =>`res_tv2`等等.在所有CamelCase转换的情况下,它不是"CamelC ase",而是"Camel Case".空格在*最后一个大写字母之前注入*,而不是之后. (7认同)

Tim*_*orr 5

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

config.autoload_paths += Dir["#{config.root}/app/models/**/"]
Run Code Online (Sandbox Code Playgroud)

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

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