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

时间:2010-12-20 23:15:29

标签: ruby-on-rails ruby environment conditional-statements helpers

在Ruby on Rails应用程序中,我有一个控制器,我想要一些有条件运行的功能,其中条件取决于运行应用程序的环境。作为一个人为的例子,在开发模式中我会喜欢这样做:

if foo == 5:
    ...
end

在制作模式中,我想:

if foo > 6:
    ...
end

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

在Rails中执行此操作的最惯用方法是什么?我会直接在environments/文件中编写辅助方法吗?或者向应用程序控制器添加一个检查当前环境的方法?或其他什么?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

before_filter :setup_variables

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

我现在可以在控制器和视图中测试我是否处于开发模式两者

另一个注意事项。如果您正在进行基于案例的切换 lot (如果开发/生产),您可能希望将其重构为一组单独的对象,这些对象可根据环境进行更换。例如,有一个DevelopmentLogic lib和一个ProductionLogic lib。