Rails 5: 自定义文件夹的自动加载不起作用

7

我有这个类:

# app/events/new_request.rb
class Events::NewRequest
end

我将该文件夹添加到自动加载中:

# config/application.rb
config.autoload_paths += %W( events/ )

当执行 rails c 命令时:

> Events::NewRequest
NameError: uninitialized constant Events
事实上,如果我在定义类时不使用命名空间“Events”,它可以成功地自动加载类。

1
这是因为events文件夹是一个根目录,或者是其他术语,我尝试了一下,通过执行app/events/events/new_request.rb成功了。 - Eyeslandic
你也可以将它放在 models/events/new_request.rb 下。 - Eyeslandic
1
@Iceman,你尝试过在Rails 5上使用吗?对我来说它不起作用。 - ascherman
1
@Iceman 是正确的,Rails 版本并不重要,通常最好在 app/anything_in_app/events 中添加一个 events.rb 文件,即使 ModuleClass 是空的,因为它有助于 Autoload 声明命名空间。 - engineersmnky
1
config.autoload_paths += [config.root.join('app')] 是解决方法。 - max
显示剩余11条评论
1个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
3
module Sandbox
  class Application < Rails::Application
    config.autoload_paths += [config.root.join('app')]
  end
end
这将使Rails能够从app/events/new_request.rb自动加载Events::NewRequest
irb(main):001:0> Events
=> Events
irb(main):002:0> Events::NewRequest
=> Events::NewRequest

我甚至不确定这为什么有效 - 这是由于自动加载路径设置的方式,使其忽略app下的第一个目录作为模块嵌套。但是迄今为止,我还没有遇到任何真正的问题与此黑客攻击。 - max
1
看起来很牵强附会,也很令人困惑,为什么这些类被命名空间化而其他类却没有,例如Controllers::ApplicationController,在我看来最好遵循约定或显式要求。 - engineersmnky
1
我同意你的观点,@engineersmnky。这证明了它是可能的,但不代表这是个好主意 :D - max
1
@blinc - 编辑帖子以澄清或改善语法、拼写或格式。不要编辑以添加未经测试且不能产生正确结果的代码到其他答案中! - max

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,