Ruby on rails 在Rails应用程序中存储全局文件的最佳位置是哪里?
我想知道在rails应用程序中的全局设置存储位置是否有最佳实践。我的意思是,我定义了几个global,它们可能会改变,但不太可能,而且似乎不适合将它们存储在DB中,因为它们被大量使用。例如,我有系统电子邮件和系统电子邮件签名和系统存储根 现在我将它们保存在environment.rb中,但我不确定这是否是存储它们的正确位置 多谢各位 编辑:Ruby on rails 在Rails应用程序中存储全局文件的最佳位置是哪里?,ruby-on-rails,ruby,environment-variables,Ruby On Rails,Ruby,Environment Variables,我想知道在rails应用程序中的全局设置存储位置是否有最佳实践。我的意思是,我定义了几个global,它们可能会改变,但不太可能,而且似乎不适合将它们存储在DB中,因为它们被大量使用。例如,我有系统电子邮件和系统电子邮件签名和系统存储根 现在我将它们保存在environment.rb中,但我不确定这是否是存储它们的正确位置 多谢各位 编辑: 被接受的答案仍然合适,但自从我开始使用后,还有其他选项,但我最喜欢configatron。environment.rb就是这个地方。您可以将其添加到模块并添
被接受的答案仍然合适,但自从我开始使用后,还有其他选项,但我最喜欢configatron。environment.rb就是这个地方。您可以将其添加到模块并添加到lib目录。然后您可以将其称为Module::MY_GLOBAL_变量。两者都有优点和缺点。在environment.rb中可以,但有时看起来很凌乱。如果所有这些全局变量都是相关的,那么您可以将它们分组到一个模块中。Rails 3引入了应用程序对象。即使使用Rails 2,您也可能希望以类似的方式存储全局变量。因为这些值经常根据您运行的环境而变化,所以我将全局变量存储在
config/environments/development.rb | production.rb | test.rb
中,为每个环境使用适当的值。我将此类配置信息存储在YML文件中。有关更多详细信息,请参阅此
或者,您可以使用名为的gem。我最喜欢的技术之一是将包含常量的文件放在目录
config/initializers/
中(此目录中的所有文件都会自动加载),但每个不同的Rails环境都有一个节。e、 g
case ENV['RAILS_ENV']
when "development"
SYSTEM_EMAIL = ...
SYSTEM_EMAIL_SIGNATURE = ...
when "staging"
SYSTEM_EMAIL = ...
SYSTEM_EMAIL_SIGNATURE = ...
when "production"
SYSTEM_EMAIL = ...
SYSTEM_EMAIL_SIGNATURE = ...
end
相反,如果您想在一个大散列中加载所有常量,那么可以将它们作为YAML文件加载。创建两个文件,一个名为config/initializers/email_constants.rb
,另一个名为config/email_constants.yml
。在后一种情况下,可以这样说:
development:
:system_email: ...
:system_email_signature: ...
staging:
:system_email: ...
system_email_signature: ...
... etc ...
然后在config/initializers/email_constants.rb
put中:
EMAIL_CONSTANTS = YAML.load_file("#{RAILS_ROOT}/config/email_constants.yml")[RAILS_ENV]
这将加载整个YAML文件,并将相应键的值(表示RAILS\u ENV
)分配给EMAIL\u常量
这两种技术的优点都是局部性。您可以将所有相互关联的常量(即本例中的电子邮件常量)放在一个文件中。另外,不是让相同的常量分布在三个不同的文件中(每个Rails环境一个),而是将它们全部放在一个文件中。通常,当我做类似的事情时,我有两种方法
1-如果我的全局变量对所有3个环境(开发、测试、生产)都是通用的,那么我将把它存储在
config/environments.rb文件
但让我们说我的价值观随着环境的变化而变化
例如:我的开发环境系统存储根是“/development\u ROOT/”,测试环境系统存储根是“/testing\u ROOT/”
然后我会把它们放在里面
配置/环境/
根据上面的例子
config/environments/development.rb将具有
系统存储根='/development根/'
config/environments/test.rb将具有
系统存储根='/testing根/'
config/environments/production.rb将具有
系统存储根='/production根/'
希望这有帮助
干杯,
sameera有趣的是,我最近开始研究Rails 3,特别是routes,但没有读太多其他内容。我来看看。谢谢你的指点,谢谢你,肖恩。我最喜欢你的方法-除了我不认为我需要分开到email_constants.yml中-我将保持所有内容都在contacnts.yml中。关于在dev/prod/test中应该相同的常量如何?有一个文件适用于所有三种环境,而不是将它们存储在所有三种环境中吗?我自己的评论的答案似乎是/config/environment.rb。如果我错了,请有人纠正我。谢谢你发布确认@Ben我只是在搜索完全相同的东西。这似乎比标记为“答案”的答案要好得多。如果Rails已经为您提供了环境的case语句,那么为什么还要提供环境的case语句呢?还要注意,如果您使用environment.rb,那么您可能需要在您的appname::Application.initialize之前定义常量!