Rails вспомогательный метод, который работает по-разному в разных средах - PullRequest
3 голосов
/ 21 декабря 2010

В приложении Ruby on Rails у меня есть контроллер, где я хотел бы, чтобы некоторые функции выполнялись условно, причем условие зависит от среды, в которой выполняется приложение. В качестве надуманного примера в режиме разработки я быкак это сделать:

if foo == 5:
    ...
end

И в производственном режиме я бы хотел:

if foo > 6:
    ...
end

Разница между двумя условиями сложнее, чем одна константа (5 или 6в приведенном выше примере).

Какой самый идиоматичный способ сделать это в Rails?Буду ли я писать вспомогательные методы прямо в environments/ файлах?Или добавить метод к контроллеру приложения, который проверяет текущую среду?Или что-то еще?

Ответы [ 2 ]

8 голосов
/ 21 декабря 2010

Я бы просто добавил проверку для 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 голос
/ 21 декабря 2010

Мне часто приходится делать это и в моих приложениях, в разных местах. Например, я не хочу включать аналитический код в режим разработки. И поэтому я установил переменную экземпляра или два в контроллере приложения:

before_filter :setup_variables

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

Теперь я могу проверить, нахожусь ли я в режиме разработки как в контроллерах, так и в представлениях.

Еще одно замечание. Если вы делаете много переключения на основе регистра (если разработка / производство), вы можете реорганизовать это в отдельный набор объектов, которые вы меняете в зависимости от среды. Например, иметь библиотеку DevelopmentLogic и библиотеку ProductionLogic.

...