Ruby on rails 常量文件的类与模块

Ruby on rails 常量文件的类与模块,ruby-on-rails,ruby,constants,Ruby On Rails,Ruby,Constants,我有很多常数:国内航班的平均长度、不同饮食类型的二氧化碳排放量、不同州的二氧化碳/千瓦时转换等。我本想把它们放在我的模型和控制器的单独文件中,但不太确定最佳做法是什么。这个文件应该是类、模块还是两者都不是?我应该把它们放在models目录中吗 示例: class CalculatorConstants AVERAGE_DOMESTIC_FLIGHT_LENGTH = 1070 class DietType def initialize(name, co2e) @nam

我有很多常数:国内航班的平均长度、不同饮食类型的二氧化碳排放量、不同州的二氧化碳/千瓦时转换等。我本想把它们放在我的模型和控制器的单独文件中,但不太确定最佳做法是什么。这个文件应该是类、模块还是两者都不是?我应该把它们放在models目录中吗

示例:

class CalculatorConstants
  AVERAGE_DOMESTIC_FLIGHT_LENGTH = 1070
  class DietType
    def initialize(name, co2e)
      @name = name
      @co2e = co2e
    end
    attr_reader (:name, :co2e)
  end

  average_diet = DietType.new('average', 684.915)
  meaty = DietType.new('meaty', 867.964)
  no_beef = DietType.new('no beef', 450.585)
  pescatarian = DietType.new('pescatarian', 612.074)
  vegetarian = DietType.new('vegetarian', 420.482)
  vegan = DietType.new('vegan', 245.793)
  DIET_TYPES = [average_diet, meaty, no_beef, pescatarian, vegetarian, vegan]
end


或者两者都没有?最好把它们放在哪里?

我更喜欢使用模块作为常量的名称空间

module CalculatorConstants
  AVERAGE_DOMESTIC_FLIGHT_LENGTH = 1070
  DietType = Struct.new(:name, :co2e)

  AVERAGE_DIET = DietType.new('average', 684.915)
  # ...
  DIET_TYPES = [AVERAGE_DIET]
end

p CalculatorConstants::DIET_TYPES

我通常通过将常量存储在yaml文件中,然后加载它们并通过哈希访问它们来解决这些问题

yaml文件的示例:

flight_length:
  domestic: 1070
  international: 3000
diet_types:
  - type1
  - type2
  - type3
Ruby代码示例:

#loading
constants = YAML.load_file(path)

#saving
File.open(path, 'w') { |f| YAML.dump(constants, f) }

#use
puts constants[:flight_length].inspect
# => { domestic: 1070, international: 3000 }

puts constants[:flight_length][:domestic]
# => 1070

puts constants[:diet_types].inspect
# => [type1, type2, type3]
它的结构很好,独立于ruby应用程序,可以在应用程序上下文之外轻松编辑,可以轻松重用或转换,例如,在javascript代码中使用json

根据您的需要,您可以将访问yaml文件中的值的方法和各种帮助程序包装为类的类方法或实例方法。如果您只是加载并保存,那么类方法可能更好。如果您有许多助手方法,那么实例方法更好。我不会选择模块

我通常使用gem来管理常量。它非常容易使用:只需将所有常量存储到YAML文件中,这些常量就可以在应用程序中使用。比如说,

# config/settings.yml
flight_length: 1070
diet_types:
  average: 684.915
  meaty: 867.964
您可以通过以下方式访问应用程序中的这些常量:

Settings.flight_length # => 1070
Settings.diet_types.average # => 684.915

我想要一个模块。因为
CalculatorConstants
就像常量的特殊名称空间。常量应该只有大写字母,例如
MEATY
。您的第二个选项无效。很好,我不知道。
Settings.flight_length # => 1070
Settings.diet_types.average # => 684.915