2009-07-28 4 views
4

レンダリング:xml in rails私は常に:dasherize => falseオプションが必要です。もちろん、ソースコードを変更する必要はありませんが、デフォルトとしてアプリケーション全体を設定する方法はありますか?このような何かをやって"patch"レールレンダリング機能がデフォルトオプションを編集するレンダリング時に

+0

うまくいけば、レンダリング機能を使用するアプリケーションの他の部分を壊してはいけません...コントローラによって呼び出されたときにのみ、このように動作するはずです(私はそれがとにかく呼び出される唯一の場所だと思います) – luca

答えて

4

は、他の誰かが見に来るとき潜在的に予期しない動作につながるの欠点を持っているかもしれない

何とか最初のものよりも優先され、その後、このオプションを指定して、それを呼び出してレンダリング機能...つまり、オーバーライドされたメソッドが見つかるまで、明示的に指定されていないときにdasherize falseのような振る舞いをするのは不思議に思うかもしれません)。つまり、ApplicationControllerまたは特定のコントローラの1つでは、renderメソッドをオーバーライドできます。

何かのように:

class MyController < ApplicationController 
    def render(options = nil, extra_options = {}, &block) 
    options ||= {} # initialise to empty hash if no options specified 
    options = options.merge(:dasherize => false) if options[:xml] 
    super(options, extra_options, &block) 
    end 
end 

あなたはdasherizeはまだあなたは、例えば、他の方向にハッシュマージを行うことができますレンダリングするために、あなたの呼び出しでオーバーライドすることを許可するかどうか

options = {:dasherize => false}.merge(options) 
+0

レンダリング 'show.xml.builder'、:layout => falseというディレクティブでページをレンダリングすると、この問題が発生しました。 optionsはハッシュの代わりにStringになります。私はそれがハッシュであることを確認するためのチェックを入れたが、それはハックのように思える。その他の提案はありますか? –

+0

'if'条件を' options.is_aならば 'にすることは妥当と思われます。ハッシュとooptions [:xml] 'また、' '保証' 'の中で' 'スーパー' '呼び出しで' begin'/'ensure'ブロックを使うことができます。 – mikej

3

また、このようなsollutionを試みることができる:

alias_method_chain :render, :no_dasherize 

def render_with_no_dasherize(options = nil, extra_options = {}, &block) 
    new_options = options 
    new_options = {:dasherize=>false}.merge(options) if(options[:xml]) 
    render_without_no_dasherize(new_options, extra_options, &block) 
end 

あなたはアプリケーションコントローラ(そうすべてコントローラがafectedされます)にのみ特定のコントローラにそれを置くことができます。

+2

これは、ある時点でオーバーライドされた関数にアクセスしたい場合があるため、これは良い方法です)。 –

関連する問題