在 Rails 应用中,实现参数配置的功能,如果不需要在提供修改接口的话,不需要用上 rails-settings-cached 这类 Gem,使用 Rails 内置的 API 即可满足基本需求。
在 3 个地方可以配置参数:
- config/application.rb
- config/environments/
- config/initializers/
# config/environments/development.rb
Rails.application.configure do
config.allow_user_register = true
end
这里的 config 是 Rails::Application::Configuration 的实例
# config/application.rb
module ApplicationName
class Application < Rails::Application
config.load_defaults 6.1
config.allow_user_register = true
end
end
通过 Rails.application.config 或者 Rails.configuration 读取配置的参数。
Rails.configuration.allow_user_register # true
嵌套配置参数
使用 Rails 中的 config.x 可以存储嵌套的参数。
config.x.payment_processing.schedule = :daily
config.x.payment_processing.retries = 3
config.super_debugger = true
读取这些参数:
Rails.configuration.x.payment_processing.schedule # => :daily
Rails.configuration.x.payment_processing.retries # => 3
Rails.configuration.x.payment_processing.not_set # => nil
Rails.configuration.super_debugger # => true
config_for
config_for 是一个很实用的从 yml 文件中读取信息的方法。 使用 Rails::Application.config_for 方法从 config 目录中的 yml 文件中读取配置信息。
# config/payment.yml:
production:
environment: production
merchant_id: production_merchant_id
public_key: production_public_key
private_key: production_private_key
development:
environment: sandbox
merchant_id: development_merchant_id
public_key: development_public_key
private_key: development_private_key
# config/application.rb
module MyApp
class Application < Rails::Application
config.payment = config_for(:payment)
end
end
读取参数: Rails.configuration.payment[‘merchant_id’] # => production_merchant_id or development_merchant_id
注:不管是在 development 还是 production 环境中,改变了 yml 配置文件的内容, config_for 是不会缓存的。