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
在 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