5

Rails アプリ (APP_CONFIG ハッシュ) でカスタム構成変数を定義しました。さて、これらの変数をモデルでどのように使用できるでしょうか? モデルで APP_CONFIG['variable'] を直接呼び出すのは、レールに沿った方法ではありません! たとえば、Rails 環境なしでこれらのモデルを使用できます。その場合、APP_CONFIG は定義されません。

ATM モデル オブザーバーを使用し、次のようにグローバル構成変数をインスタンス変数に割り当てます。

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

しかし、このソリューションはモンキー パッチのように見えます。より良い方法はありますか?

または、最もシンプルに保ち、新しいアプリ (Rails アプリではない) で APP_CONFIG ハッシュを定義するだけでよいのでしょうか?

4

3 に答える 3

1

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

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

また、構成が単一のメソッドにのみ必要な場合は、単純にメソッドに渡します。

def something(config = APP_CONFIG)
  # do something
end

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

別のグローバル変数/定数を定義する代わりに、代わりにRails 構成を使用することもできます。

def something(config = Rails.config)
  # do something
end
于 2012-07-30T17:44:04.363 に答える
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
于 2013-12-10T16:29:10.003 に答える
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']モデルで使用できるようになりました

于 2012-07-31T04:04:07.173 に答える