【问题标题】:Ruby/Rails organizing and loading constants for an entire moduleRuby/Rails 为整个模块组织和加载常量
【发布时间】:2020-07-16 16:11:13
【问题描述】:

这个问题可能只是针对 Ruby,但正是因为在 Rails 上工作,才促使我提出这个问题。

假设我正在创建一个新的module,以便我可以更好地组织相关/耦合代码。我们称这个模块为amazing_feature,它的所有类/子模块都位于app/services 目录中。所以按照代码加载原则,整个模块应该在app/services/amazing_feature目录下才能正常加载。

假设我有两个用于这个模块的类:

# app/services/amazing_feature/thing_one.rb
module AmazingFeature
  class ThingOne
    ...
  end
end

# app/services/amazing_feature/thing_two.rb
module AmazingFeature
  module ThingTwo
    ...
  end
end

我希望有一些常量可用于module AmazingFeature 中的所有类/子模块,以及可从AmazingModule 命名空间用于任何外部代码(例如,其他控制器和模型,在Rails 的观点)。例如,如果我想定义MY_CONSTANT = 1,那么它可以在模块内以MY_CONSTANT 的形式访问,从模块外部以AmazingFeature::MY_CONSTANT 的形式访问。

所以问题是,我如何才能在 Ruby 或 Rails 中真正做到这一点?我有一些想法,认为可能有效的方法,或者我在其他地方看到的方法,例如其他 SOF 帖子:

  • 直接在app/services 中为将常量直接关联到模块的模块创建一个文件。我不喜欢这种方法,因为将与模块耦合的文件放在其子目录之外感觉很奇怪。
# app/services/amazing_feature.rb
module AmazingFeature
  MY_CONSTANT = 1
end
  • 全局加载常量作为 Rails 初始化程序(即在config/initializers 中)。我对这种方法也有同样的厌恶。
  • 在子目录中创建Constants 模块,以便常量与模块的所有其他代码位于同一位置。我只是不知道如何正确地将这些常量与父模块相关联,因此此代码示例中缺少部分。
# app/services/amazing_feature/constants.rb
module AmazingFeature
  module Constants
    MY_CONSTANT = 1
  end
end

# Now what??? :(
  • 其他方法?我在这里不知所措。

谢谢。

【问题讨论】:

标签: ruby-on-rails ruby


【解决方案1】:

当然,您可以随心所欲,但可以从流行的宝石中汲取灵感:

通常依靠 Ruby 自动加载器将常量名称 (AmazingFeature) 映射到包含这些常量的文件名。所以AmazingFeature 可以映射到load/path/amazing_feature.rbAmazingFeature::Greatness 可以映射到load/path/amazing_feature/greatness.rb

我建议这样做,很快就不会觉得奇怪了 :)

【讨论】:

    【解决方案2】:

    我认为这是个好主意:

    # app/services/amazing_feature/constants.rb
    module AmazingFeature
      module Constants
        MY_CONSTANT = 1
      end
      include AmazingFeature::Constants
    end
    
    module AmazingModule
     include AmazingFeature::Constants
    end
    
    # Then
    AmazingFeature::MY_CONSTANT # => 1
    AmazingModule::MY_CONSTANT # => 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-05
      • 1970-01-01
      • 2021-12-30
      • 1970-01-01
      • 2020-10-25
      • 1970-01-01
      • 2018-01-08
      • 2023-03-18
      相关资源
      最近更新 更多