如何在Rails中将一个初始化文件中定义的常量访问到另一个初始化文件中?

时间:2019-05-22 08:21:46

标签: ruby-on-rails ruby-on-rails-3

我已经定义了一个throttling_request.yml这样的YAML文件

logged_in_user:
  watching_timespan: 60
  allowed_requests:  60
  blocking_timespan: 300

non_logged_in_user:
  watching_timespan: 300
  allowed_requests:  300

我将YML文件加载到config/intializers/throttle_config.rb

config = YAML.load_file('config/throttling_request.yml').with_indifferent_access
THROTTLE_REQ_NON_LOGGED_IN = config[:non_logged_in_user]
THROTTLE_REQ_LOGGED_IN     = config[:logged_in_user]

但是我想将此常量THROTTLE_REQ_NON_LOGGED_IN访问到另一个初始化文件config/initializers/rack_attack.rb

  configs = ::THROTTLE_REQ_NON_LOGGED_IN

  # Throttle all requests by IP (20rpm)
  #
  # Key: "rack::attack:#{Time.now.to_i/:period}:req/ip:#{req.ip}"
  throttle('req/ip', limit: configs[:allowed_requests], period: configs[:watching_timespan]) do |req|
    req.ip unless req.path.start_with?('/assets')
  end

我无法使用常量解析器::的常量THROTTLE_REQ_NON_LOGGED_IN进行加载。我想将常数THROTTLE_REQ_LOGGED_IN用于其他类,并将THROTTLE_REQ_NON_LOGGED_IN用于机架攻击配置。因此,我不想在机架攻击初始化程序文件中混淆调用此常量。

请让我知道是否需要我提供其他信息。

1 个答案:

答案 0 :(得分:1)

建议的解决方案

在您的application.rb中执行以下操作:

::THROTTLE_CONFIG = YAML.load_file('config/throttling_request.yml').with_indifferent_access

现在,您可以在项目中的任何地方,包括config/initializers/rack_attack.rb,进行以下操作:

THROTTLE_CONFIG[:non_logged_in_user]