Rails 应用程序:自动加载 类 在模块中定义

Rails app: autoloading classes defined in modules

在 Rails 5.0.1 应用程序中我有文件 app/actions/frontend/cart/get_cart_items_summarized.rb with:

module Actions
  module Frontend
    module Cart
      class GetCartItemsSummarized
        #content here
      end
    end
  end
end

app/helpers/application_helper.rb 中,我称之为:

def get_cart_items
  #...
  items = Actions::Frontend::Cart::GetCartItemsSummarized.new.call
  #...
end

但我得到:

未初始化常量ApplicationHelper::Actions

为什么?我该如何使用这个 class?

谢谢

要么使用全限定名称:

::Actions::Frontend::Cart::GetCartItemsSummarized.new.call

或者只是坚持 Rails 不断查找(下面应该有效):

GetCartItemsSummarized.new.call

在rails/autoloading中,第一级目录,即app下的目录,不被视为名称的一部分。这样你的模型就可以是 User 而不是 Models::User,等等

我的解决方案是将所有自定义内容放入 app/lib。这样,lib 吃掉了那个非命名层,你的文件夹结构的其余部分变成了一个名字。在你的例子中,把你的文件放到

app/lib/actions/frontend/cart/get_cart_items_summarized.rb

当然,您可以随意将 "lib" 替换为您想要的任何内容(例如 "app/custom")。这个名字不重要。

在"config/application.rb"中,添加"app"到自动加载路径,例如:

class Application < Rails::Application

  config.autoload_paths += Dir[Rails.root.join('app')]

end