2016-05-10 5 views
0

ENVに存在しないキーが要求された場合にエラーを発生させるために、ENVをテンプレートメソッド内でシャドウしたいと思います。明らかに、特定のメソッド(特定のバインド)の中でのみ、他の場所で定数をシャドーしたくありません。これも可能ですか?バインディング内のトップレベル定数をシャドーする

説明者: - 私はHash#fetchの存在について知っており、いつもどこでも使用しています。しかし、私はこれをERBテンプレートで使用して、設定ファイルを生成します。この設定ファイルは通常より多くの人が触れている可能性があります。誰もハッシュキーが見つからない場合にnilを返すRubyの動作に精通しているわけではありません。私はまた、後半の構成ミス(または誤った構成やフォーマットの誤解)が顕著な製造不良を引き起こしたシステムに取り組んでいます。失敗はオペレータのエラーでした。したがって、私はそのテンプレート内でのみ、募金の原因となる大会を設立したいと考えています。さらにstrict_envという宝石は既にありますが、ENVの代わりにSTRICT_ENVを使用することを覚えておかなければなりません。この特定のワークフローのためのすべての "you have to"ステートメントは、この特定のケースでは赤い旗私はもっ​​と頑強にしたいからね。もちろん、より厳密なテンプレート言語を選択し、その言語のロジックを使用して(たとえばMustache)、チームはすでにERBに精通しているので、RailsはERBテンプレートのYMLを実行可能な設定アプローチとして推奨しますあなたはそれに同意しないかもしれませんが)私はあまりにもそのワークフローに固執することができればいいです。だから私はENV[]の動作をローカルで変更したいのです。

+0

いくつかのコードが役立つだろう。テンプレート方法がどのように使用されるかを概説できますか? – Stefan

+0

いいえ、定数をシャドーすることはできません。しかし、これは[XY問題](http://xyproblem.info/)のように聞こえる。定数をシャドーする方法を尋ねるのではなく、あなたが解決しようとしている問題の詳細とこれまでに書いたコードを提供してください。 –

+0

つまり、 "shadow"と同じ定義を使用しているとします(外部スコープからの変数と同じ名前のローカルスコープ内の変数を定義し、それがあいまいになるなど)元の変数)。繰り返しますが、いくつかのコードは、私たちがあなたを助けるのを助けるために遠くに行くでしょう。 –

答えて

1

ERB#resultは、オプションの結合を取る:

require 'erb' 

class Foo 
    ENV = { 'RUBY_VERSION' => '1.2.3' } 
    def get_binding 
    binding 
    end 
end 

template = "Ruby version: <%= ENV['RUBY_VERSION'] %>" 

ERB.new(template).result 
#=> "Ruby version: 2.1.3" 

b = Foo.new.get_binding 

ERB.new(template).result b 
#=> "Ruby version: 1.2.3" 
+0

Ooh!これはきちんとしています(そして、ハッキーです。)これで遊ぶよ、ありがとう! – Julik

0

ENV.fetch(key)を使用して、キーが存在しない場合に発生させることができます。

あなたのような、ENVにクラスとデリゲートを作成することができること以外に

class Configuration 
    def self.[](key) 
    ENV.fetch(key) 
    end 
end 

しかし、これはハッシュのために同じ動作であるため、代わりに#fetch#[]からエラーを上げると、よりルビーのようです。

最後に、あなたはモンキーパッチENVできますが、これは通常行うには良いことではありません。私はENVがオブジェクトであるため、この猿のパッチをローカライズするためにrefinementsを使用することはできません知っている限り

def ENV.[](key) 
    fetch(key) 
end 

を、クラスではなく、そのクラスはObjectです。

+0

私が追加した説明者を見てください。これは、人々が習慣によって代わりに 'ENV ['smth']'を使用し続けるか、または正常なシステムデフォルトがすでに存在する抽象化を強制的に使用することを除いて、完全に機能します。 – Julik

+0

私は猿のパッチENVに道を追加しましたが、これは世界的にこれを行い、おそらく他の場所に侵入します。 – Kris

関連する問題