2011-09-22 4 views
6

내 webapp는 세션 데이터를 암호화해야합니다. 내가 설정 한 내용은 다음과 같습니다.레일 3.1 : 웹 애플 리케이션 (레일 서버/유니콘/등)에 대해서만 이니셜 라이저를 실행하는 방법

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 

모든 것이 훌륭하게 작동하고 세션 데이터를 안전하게 유지합니다. 문제는 다음과 같습니다. 사용자 정의 레이크 작업을 실행할 때 이니셜 라이저를로드하고 모든 세션을 지 웁니다. 안좋다!

이니셜 라이저에 webapp 초기화를 위해서만 실행되도록하려면 무엇을 넣을 수 있습니까? 또는 레이크 작업으로 실행하지 않도록하려면 이니셜 라이저에 무엇을 넣을 수 있습니까?

업데이트 : 좋아, 지금까지 내가 수행 한 작업은 .rake 파일에 MYAPP_IN_RAKE = true unless defined? MYAPP_IN_RAKE을 추가하는 것입니다. 그리고 나서 이니셜 라이저에서 다음을 수행합니다.

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

작동합니다. 그러나 나는 다른 제안에 대해 개방적이다.

당신은이 같은`설정/application.rb '에서 응용 프로그램에 대한 수정을 할 수
+0

이 미래에 다른 방법으로 당신을 무는 책임을 보인다. 서버가 다시 시작될 때마다 (의도 한 동작 인 것처럼 보이는) 모든 세션을 잃어 버릴 수 있지만 너무 많은 메모리를 사용하여 자동 저장되는 서버, 너무 오래 실행되는 요청 등을 포함합니다. –

+0

단점을 이해하지만, 그럴만 한 가치가 있다고 생각합니다. 응용 프로그램을 다시 시작하는 중 세션 재설정 : 허용. 너무 많은 메모리 또는 너무 긴 요청? 유니콘 하에서 이러한 상황은 작업자 프로세스에서만 발생해야합니다. 그리고'preload_app = true'를 설정했기 때문에 초기화는 마스터에서만 발생합니다. 따라서 유니콘은 재 초기화를하지 않고도 작업자를 다시 생성 할 수 있습니다. – sbutler

+0

[레일즈 서버 \'에서만 실행되고 레일스에서는 \ 등을 생성하지 않는 [레일즈 3 초기화 프로그램]의 가능한 복제본 (http://stackoverflow.com/questions/8660019/rails-3-initializers-that- run-on-on-rails-server-and-not-rails-generate-e) – davmac

답변

8

는 :

module MyApp 
    def self.rake? 
    [email protected] 
    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의 프로그램 성격은 당신에게 상당한 유연성을 제공한다.

+0

그래,이게 맘에 든다. 저는 정의되지 않은 한 setter를'@rake = !! value로 변경했습니다. @ rake'를 사용하면 한 번만 설정됩니다. 그런 다음 environment.rb MyApp.rake = false'에 추가했습니다.합리적인 소리? – sbutler

+0

한 번만 설정하는 것에 대해 걱정할 이유가 무엇입니까? 복제 세트를 무시하는 것보다 더 나은 방법은 최소한 경고를 내보내거나 문제의 원인을 추적 할 수 있도록 예외를 throw하는 것입니다. – tadman

+0

나는 webapp 코드로 실행하는 동안 어떻게 든 Rakefile이로드 될 것이라고 염려합니다. 대칭 적으로 생각하고 있습니다. 레이크처럼 웹 애플리케이션 환경이로드됩니다. 따라서 웹 애플리케이션으로 레이크가로드되는 경우도 처리해야합니다. – sbutler

2

주위에 다른 일이있다 :

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

당신이 레이크 당신의 ENV [ "RAILS_ENV"]로 시작

이 전무 할 것이다가. 'test'테스트는 rspec을 사용할 때 실행되지 않도록하는 것입니다.

Rails.env를 사용하는 것이 좋지만 초기화되지 않은 경우 "개발"을 반환합니다.

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 
+0

감사합니다. 내가 필요한 것! –

관련 문제