2012-07-30 1 views
5

私のレールアプリ(APP_CONFIGハッシュ)にカスタム設定変数を定義しました。さて、私のモデルでこれらの変数を使用するにはどうすればいいですか?モデルでAPP_CONFIG ['variable']を直接呼び出すのはレールではありません!たとえば、Rails環境を使わずにこれらのモデルを使用することができます。その後、APP_CONFIGは定義されません。モデルにRailsアプリケーション設定変数を使用

def after_initialize model 
    Mongoid.observers.disable :all do 
    model.user_id = APP_CONFIG['user_id']) 
    model.variable = User.find(model.user_id).variable 
    end 
end 

しかし、このソリューションは、モンキーパッチのようになります。私はモデルオブザーバを使用して、インスタンス変数とグローバル設定変数を割り当て、このよう

ATMより良い方法がありますか?

または、私はそれを最も単純にして、新しいアプリケーション(Railsアプリではない)でAPP_CONFIGハッシュを定義するだけで済みます。

答えて

2

私は依存性注入を使用します。あなたは、さまざまな設定値を必要とするオブジェクトがある場合は、コンストラクタで設定オブジェクトを挿入できます。

class Something 
    def initialize(config = APP_CONFIG) 
    @config = config 
    end 
end 

と設定は、単一の方法のために必要とされている場合は、単にメソッドに渡し

def something(config = APP_CONFIG) 
    # do something 
end 

メソッドが呼び出されたときにRubyがパラメータを評価します。デフォルト値では、手動でメソッドに渡すことなく、テストで実際の設定の代わりにスタブを使用することなく、開発/プロダクションで設定オブジェクトを使用することができます。

代わりの定義別のグローバル変数/定数、あなたの可能性もuse the Rails config代わり:

def something(config = Rails.config) 
    # do something 
end 
0

/config/config.yml

defaults: &defaults 
    user_id :100 

development: 
    <<: *defaults 

test: 
    <<: *defaults 

production: 
    <<: *defaults 

/config/initializers/app_config.rb

APP_CONFIG = YAML.load_file("#{Rails.root}/config/config.yml")[Rails.env] 

APP_CONFIG['user_id']

モデルで使用できるようになりました
0

使用:before_createモデルにローカライズされたコードを保つために:

class MyModel < ActiveRecord::Base 

    before_create :set_config 

    private 

    def set_config 
    self.app_config = APP_CONFIG 
    end 
end 

あるいは、代替手段として、あなたはActiveSupport::Concernを使用することができ、あなたがうまくNモデルで再利用することができ、モジュールを作成するための非常にきれいな方法であります:

class MyModel < ActiveRecord::Base  
    include AppConfig  
end 

module AppConfig 
    extend ActiveSupport::Concern 

    included do 
     #... 
    end 

    module ClassMethods 
     #... 
    end 

    def app_config 
     APP_CONFIG 
    end 
end 
関連する問題