常量文件

时间:2015-11-18 19:05:36

标签: ruby-on-rails ruby constants

我有很多常数:国内航班的平均长度,不同饮食类型的二氧化碳排放量,以及不同州的二氧化碳/千瓦时转换等等。我想把它们放在一个单独的文件中我的模型和控制器,但不太确定最佳实践是什么。这个文件应该是一个类,一个模块,还是两个都不是?我应该将它们放在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
  #Above Code
end
是不是?把它们放在哪里最好?

3 个答案:

答案 0 :(得分:1)

我更喜欢将模块作为常量的命名空间。

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

答案 1 :(得分:1)

我通常使用config 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

答案 2 :(得分:0)

我通常通过在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应用程序,可以在应用程序上下文之外轻松编辑,可以轻松地重复使用或转换,例如json用于javascript代码。

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

Official yaml web site