1

私たちのアプリケーションは多くの環境を使用しているため、問題を壊すことなく設定を試すことができます。典型的なコントローラ アクションでは、次のようなものがあります。

def some_action    
  ...
  if @foo.development_mode == 'Production'           
    @settings = SomeHelper::Production.lan(bar)
  elsif @foo.development_mode == 'Beta'
    @settings = SomeHelper::Beta.lan(nas)
  elsif @foo.development_mode == 'Experimental'
    @settings = SomeHelper::Experimental.lan(nas)
  end
  ...
 end

これらは数十あるので、次のようなもので物事を乾かしてみることができると考えました。

 @settings = "SomeHelper::#{@foo.development_mode}.lan(bar)"

これは明らかに機能しません-私はただ得ます:

 "NasHelper::Production.lan(bar)"

どうすればこれを減らすことができますか、それとも私が持っているものに固執する必要がありますか??

4

2 に答える 2

1

オブジェクトではなく文字列で終わることが懸念される場合は、次を使用できますString.constantize(Railsのみ、標準のRubyではこれを実装する必要があります。Object.const_get(String)を使用します)

別のオプションは.const_get(たとえばObject.const_get(x)、xは文字列です)、それ自体では正しくネストされないため、「::」などで分割する必要があります。

また、eval文字列を評価するために使用するオプションがあります。ただし、注意してください。eval慎重に使用するか(強力です)、まったく使用しないでください。

編集:

これは、次の代わりに次のことを意味します。

 @settings = "SomeHelper::#{@foo.development_mode}.lan(bar)"

あなたは実行することができます:

 @settings = "SomeHelper::#{@foo.development_mode}".constantize.lan(bar)

有用な情報源:

http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-constantize

http://www.ruby-forum.com/topic/183112

http://blog.grayproductions.net/articles/eval_isnt_quite_pure_evil

于 2012-11-15T21:06:08.647 に答える
0

最初のケースで@settingsは、メソッドの結果を受け取りSomeHelper::Production.lan(bar)ます。2 番目@settingsは文字列を取得するだけです。ここでリンクされたメソッドを使用して、メソッドまたはを起動できますが、これは私の最初の選択ではありません。sendObjecteval

車輪を再発明しているように見えます.Railsにはすでに「環境」の概念があり、すべてにうまくつながっていますapp/config/environments.. サーバーの起動時に環境を設定し、 のようにテストできますRails.env.production?。新しい環境を作成するには、新しい環境に最も近い既存の環境ファイルをコピーするだけです。たとえば、必要に応じてコピーproduction.rbbeta.rbて編集し、テストRails.env.beta?します。

しかし、これではまだ、どこにあるのかをテストする必要があります。直接割り当てることができる値をconfigハッシュ (例: ) に追加できます。デフォルトがあるか、すべての環境で定義されていることを確認する必要がありますが、これはおそらく正しいアプローチだと思います...何を達成しようとしているのか正確にはわかりません.config.some_helper.lan = 'bar'@settings

于 2012-11-15T21:20:16.730 に答える