私のwebappはセッションデータを暗号化する必要があります。私がセットアップしたもの:Rails 3.1:Webアプリケーション(レールサーバー/ユニコン/ etc)のイニシャライザを実行する方法
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
すべてがうまく動作し、セッションデータを保護します。問題は次のとおりです。カスタムレイクタスクを実行すると、イニシャライザが読み込まれ、すべてのセッションがクリアされます。良くない!
私は自分のイニシャライザに入れて、Webアプリケーションの初期化のためだけに実行することができますか?または、私は自分のイニシャライザでレイクタスクを実行しないようにするために何を入れることができますか?
更新:これまでに行ったことは、.rakeファイルにMYAPP_IN_RAKE = true unless defined? MYAPP_IN_RAKE
を追加することです。私のイニシャライザでは次のようにします:
unless defined?(MYAPP_IN_RAKE) && MYAPP_IN_RAKE
# Web only initialization
end
と思われます。しかし、私は他の提案に開放しています。
これは、将来的には他の方法であなたを噛まないように責任を負うようです。サーバーが再起動されると、(意図された動作であると思われる)すべてのセッションを失うことになりますが、あまりにも多くのメモリを使用して自動取得され、要求が長時間実行されているなどがあります。 –
欠点を理解するが、それはそれが価値があると思う。アプリケーションを再起動してセッションをリセットする:受け入れ可能。メモリが多すぎるか、リクエストが長すぎますか?ユニコーンでは、これらの状況はワーカープロセスでのみ発生する必要があります。そして 'preload_app = true'を設定しているので、初期化はマスターでのみ起こります。したがって、ユニコンは再初期化を行わずにワーカーを復活させることができます。 – sbutler
[Rails 3の初期化子が\ rails server \のみで実行され、\ rails generate \ 'などは使用できません](http://stackoverflow.com/questions/8660019/rails-3-initializers-that- run-on-rails-server-and-not-rails-generate-e) – davmac