如何将一个初始化文件中定义的常量访问到 rails 中的另一个初始化文件?
How can I access a constant defined in one initializer file into another initializer file in rails?
我定义了这样一个 YAML 文件throttling_request.yml
logged_in_user:
watching_timespan: 60
allowed_requests: 60
blocking_timespan: 300
non_logged_in_user:
watching_timespan: 300
allowed_requests: 300
我在 config/intializers/throttle_config.rb
加载 YML 文件
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
。我想在机架攻击配置中为我的其他 class 和 THROTTLE_REQ_NON_LOGGED_IN
使用常量 THROTTLE_REQ_LOGGED_IN
。所以我不想在机架攻击初始化文件中混淆调用这个常量。
如果需要我提供任何其他信息,请告诉我。
建议的解决方案
在您的 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]
我定义了这样一个 YAML 文件throttling_request.yml
logged_in_user:
watching_timespan: 60
allowed_requests: 60
blocking_timespan: 300
non_logged_in_user:
watching_timespan: 300
allowed_requests: 300
我在 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
。我想在机架攻击配置中为我的其他 class 和 THROTTLE_REQ_NON_LOGGED_IN
使用常量 THROTTLE_REQ_LOGGED_IN
。所以我不想在机架攻击初始化文件中混淆调用这个常量。
如果需要我提供任何其他信息,请告诉我。
建议的解决方案
在您的 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]