2009-07-28 11 views
4

wenn ich rendern: xml in Schienen Ich möchte immer die: dasherize => false Optionen. Gibt es eine Möglichkeit, die Anwendung als Standard festzulegen, ohne den Quellcode der Rails zu ändern?"Patch" Schienen Render-Funktion zum Bearbeiten von Standardoptionen

vielleicht eine Funktion machen, die irgendwie den Vorrang vor dem ersten nimmt und dann ruft er mit dieser Option ...

+0

hoffentlich sollte es keinen anderen Teil der Anwendung brechen, die die Renderfunktion verwendet ... es sollte nur so funktionieren, wenn es von einem Controller aufgerufen wird (ich denke, das ist der einzige Ort, von dem es sowieso abgerufen wird.) – luca

Antwort

4

so etwas wie dies tun die Kehrseite hat potenziell zu unerwartetem Verhalten führen, wenn jemand anderes zu suchen kommt Bei Ihrem Code (dh bis sie Ihre überschriebene Methode entdecken, fragen sie sich vielleicht, warum sie sich wie dasherize false verhält, wenn dies nicht explizit angegeben wurde.) Das heißt, in ApplicationController oder einem Ihrer spezifischen Controller können Sie die Rendermethode überschreiben.

z.B. so etwas wie:

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 

Wenn Sie dasherize erlauben immer noch in Ihre Anrufe overridable zu sein, Sie zu machen, in der anderen Richtung, um die Hash-merge tun z.B.

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

Ich habe Probleme damit, wenn ich eine Seite mit der Direktive rende: render 'show.xml.builder',: layout => false. Optionen ist dann ein String statt eines Hash. Ich überprüfe, ob es ein Hash ist, aber es scheint wie ein Hack. Irgendwelche anderen Vorschläge? –

+0

Scheint vernünftig, die 'if'-Bedingung in 'if options.is_a? Hash und ooptions [: xml] 'Alternativ könntest du einen' begin'/'sure' Block mit dem' super' Aufruf im 'sure' verwenden. – mikej

3

Sie auch eine sollution wie diese könnten versuchen:

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 

Sie es in Application Controller setzen können in einem bestimmten Controller (so alle Controller werden afected werden) oder nur.

+2

Dies ist eine gute Übung, da Sie vielleicht einige Zeit auf die Override-Funktion zugreifen möchten;) –

Verwandte Themen