Rails 3.1: как запустить инициализатор только для веб-приложения (rails server / unicorn / etc) - PullRequest
7 голосов
/ 22 сентября 2011

Мое веб-приложение должно зашифровать данные своего сеанса.Я настраиваю:

config/initializers/encryptor.rb:

require 'openssl'
require 'myapp/encryptor'

MyApp::Encryptor.config[ :random_key ] = OpenSSL::Random.random_bytes( 128 )
Session.delete_all

app/models/session.rb:

require 'attr_encrypted'

class Session < ActiveRecord::Base
  attr_accessible :session_id, :data
  attr_encryptor :data, :key => proc { MyApp::Encryptor.config[ :random_key ] }, :marshal => true

  # Rest of model stuff
end

Все это прекрасно работает и обеспечивает безопасность данных сеанса.Вот в чем проблема: когда я запускаю свои собственные грабли, он загружает инициализатор и очищает все сессии.Не хорошо!

Что можно вставить в мой инициализатор, чтобы он работал ТОЛЬКО для инициализации веб-приложения?Или, что я могу добавить в мой инициализатор, чтобы он НЕ работал для задач rake?

Обновление: ОК, на данный момент я добавил MYAPP_IN_RAKE = true unless defined? MYAPP_IN_RAKE к моему.файл граблей.И тогда в моем инициализаторе я делаю:

unless defined?( MYAPP_IN_RAKE ) && MYAPP_IN_RAKE
    # Web only initialization
end

Кажется, работает.Но я открыт для других предложений.

Ответы [ 2 ]

9 голосов
/ 22 сентября 2011

Вы можете внести изменения в ваше приложение в `config / application.rb 'следующим образом:

module MyApp
  def self.rake?
    !!@rake
  end

  def self.rake=(value)
    @rake = !!value
  end

Тогда в вашем Rakefile вы добавите:

MyApp.rake = true

Хорошо использовать методы, а не константы, поскольку иногда вы предпочитаете изменить или переопределить их позже. Кроме того, они не загрязняют корневое пространство имен.

Вот пример config/initializers/rake_environment_test.rb сценария:

if (MyApp.rake?)
  puts "In rake"
else
  puts "Not in rake"
end

Программируемая природа Rakefile дает вам значительную гибкость.

2 голосов
/ 18 февраля 2014

Есть еще одна работа:

unless ENV["RAILS_ENV"].nil? || ENV["RAILS_ENV"] == 'test'

Когда вы запускаете с рейком, ваш ENV ["RAILS_ENV"] будет равен нулю.Тест для 'test' должен избегать запуска при использовании rspec.

Я знаю, что рекомендуется использовать Rails.env, но он возвращает "development", когда он не инициализирован.1008 *http://apidock.com/rails/Rails/env/class

# File railties/lib/rails.rb, line 55
def env
  @_env ||= ActiveSupport::StringInquirer.new(ENV["RAILS_ENV"] 
     || ENV["RACK_ENV"] || "development")
end
...