7

Webアプリケーションはセッションデータを暗号化する必要があります。私が設定したものは次のとおりです。

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タスクを実行すると、初期化子がロードされ、すべてのセッションがクリアされます。良くない!

初期化子をWebアプリの初期化でのみ実行するようにするには、何を入れることができますか?または、初期化子をレーキタスクで実行されないようにするために何を入れることができますか?

更新:MYAPP_IN_RAKE = true unless defined? MYAPP_IN_RAKEわかりました。今のところ、.rakeファイルに追加しています。そして、私の初期化子で私はします:

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

動作しているようです。しかし、私は他の提案を受け入れています。

4

2 に答える 2

9

次のように、 `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大きな柔軟性が得られます。

于 2011-09-22T02:07:16.063 に答える
2

別の回避策があります:

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

rakeを使用して起動すると、ENV["RAILS_ENV"]はnilになります。'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
于 2014-02-17T21:38:19.583 に答える