在不同环境中工作方式不同的Rails帮助方法

3

在Ruby on Rails 应用程序中,我有一个控制器,我希望某些功能在特定条件下运行,这些条件取决于应用程序运行的环境。举个例子,在开发模式下,我想要做:

if foo == 5:
    ...
end

在生产模式下,我希望:
if foo > 6:
    ...
end

这两种条件之间的差异比单个常量(如上例中的5或6)更为复杂。

在Rails中,最惯用的方法是什么?我应该直接在environments/文件中编写帮助方法吗?还是添加一个检查当前环境的应用程序控制器方法?或者其他什么方法?

2个回答

8

我建议在逻辑语句中添加对ENV['RAILS_ENV']的检查。

http://guides.rubyonrails.org/configuring.html#rails-environment-settings

我会将您的代码更改为:

if foo == 5 && ENV['RAILS_ENV'] == "development" then
    ...
elsif foo > 6 && ENV['RAILS_ENV'] == "production" then
    ...
end

这只是流程控制中的另一个条件,没有必要让它变得复杂。

如果您需要经常执行此操作,则可以使用application.rb中的几种方法:

def isDev
    ENV['RAILS_ENV'] == "development"
end

def isProd
    ENV['RAILS_ENV'] == "production"
end

我知道这个(或在Rails 3应用程序中的Rails.env)。我的问题是在哪里以及如何最好地将其纳入应用程序(在应用程序控制器中,在environment.rb中等)。 - jrdioko

1

我经常在我的应用程序中的各个地方需要这样做。例如,我不想在开发模式下包含分析代码。因此,我在应用程序控制器中设置了一个或两个实例变量:

before_filter :setup_variables

def setup_variables
  @development = (ENV['RAILS_ENV'] == "development")
  @production  = (ENV['RAILS_ENV'] == "production")
end

现在我可以测试我是否处于开发模式,无论是在控制器还是视图中。

另外需要注意的一点是,如果你正在进行大量的基于情况的切换(如开发/生产),你可能希望将其重构为一个单独的对象集,根据环境进行交换。例如,有一个DevelopmentLogic库和一个ProductionLogic库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接