【问题标题】:Rails app: autoloading classes defined in modulesRails 应用程序:自动加载模块中定义的类
【发布时间】:2017-10-15 09:07:57
【问题描述】:

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

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

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

谢谢

【问题讨论】:

    标签: ruby-on-rails ruby include autoload


    【解决方案1】:

    使用全名:

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

    或者只是坚持使用 Rails 常量查找(下面应该可以):

    GetCartItemsSummarized.new.call
    

    【讨论】:

    • 不,FQN 无济于事。
    • Sergio Tulentsev - 为什么不呢?
    • @SergioTulentsev 嗯?当然,当类定义如上时,FQN 确实有效。
    • @mudasobwa:我不这么认为。您的第二个示例可能有效。但第一个不会。我愿意为此赌上一杯啤酒。
    • @mudasobwa:这不是类定义格式。这是它的文件所在的位置。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 这看起来像域逻辑,所以我仍将其保留在/app
    • @fylooi:然后将其保存在/app/domain 中)。将其与视图分开。
    【解决方案3】:

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

    class Application < Rails::Application
    
      config.autoload_paths += Dir[Rails.root.join('app')]
    
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-19
      • 1970-01-01
      • 2020-10-25
      • 1970-01-01
      • 2013-01-13
      • 1970-01-01
      • 1970-01-01
      • 2011-01-08
      相关资源
      最近更新 更多