3

我有一个类似这样的导轨设置。

应用程序/服务/TestService.rb

class TestService

  def self.doSomething
    return 'Hello World!'
  end

end

我在控制器中使用这个文件。

require 'TestService'

class IndexController < ApplicationController

  def index
    @message = TestService.doSomething
  end

end

我还在 config 文件夹中的 application.rb 中添加了这个,以便在服务文件夹中自动加载类。

config.autoload_paths += %W(#{config.root}/app/service)

但是该应用程序似乎没有获取对 TestService 类的更新。我该如何解决这个问题,以便在不重新启动服务器的情况下显示 TestService 类中的更改。

4

2 回答 2

2

require尝试加载包含可重新加载常量的文件时不要使用。

通常,您无需执行任何特殊操作即可使用该常量。您将直接使用常量,而无需使用require或其他任何东西。

但是,如果您想干净利落地使用您的代码,ActiveSupport可以为您提供一种不同的方法来加载这些文件:require_dependency.

require_dependency 'test_service'

class IndexController < ApplicationController
  ...
end

尽管令人困惑的是,您会尝试干净利落并显式加载包含TestService但不显式加载包含ApplicationController...的文件。

您不需要更改autoload_paths配置。


更新 1

为了让 Rails 找到并加载您的常量(类和模块),您需要执行以下操作:

您必须确保应用程序中的每个可重新加载常量都位于具有正确文件名的文件中。该文件必须始终位于 的某个子目录中app,例如app/modelsorapp/services或任何其他子目录。如果常量名为TestService,则文件名必须以 . 结尾test_service.rb

算法是:"TestService".underscore + ".rb" #=> "test_service.rb".

filename_glob = "app/*/" + the_constant.to_s.underscore + ".rb"

因此,如果常数为TestService,则 glob 为app/*/test_service.rb。所以坚持常数app/services/test_service.rb会起作用,app/models/test_service.rb尽管后者是不好的形式。如果常量是SomeModule::SomeOtherModule::SomeClass,则需要将文件放入app/*/some_module/some_other_module/some_class.rb.

于 2012-10-21T05:26:49.407 回答
0

你说你的文件在app/server,但你正在自动加载app/service。哪个是对的?

将您的文件重命名为app/service/test_service.rb,自动加载器应该可以工作。Rails 在你的自动加载路径中寻找 snake_cased 文件名。require一旦自动加载行为正确,您也不需要手册。

于 2012-10-21T05:14:54.077 回答