2009-06-23 4 views
0

Ich versuche, eine sehr komplexe Blackbox dazu zu bringen, einige Floats anders darzustellen (es ist die Gruff-Graphikbibliothek, also wird diese zu einem Bild gerendert).Überschreiben von Basisklassenmethoden in einem Controller

in der Konsole kann ich diese Paste:

logger = RAILS_DEFAULT_LOGGER 
    logger.debug "Here's a float #{455.67.to_s}" 
    eval %{class Float 
    def to_s_with_time 
     h = (self/60).to_i 
     m = self.to_i % 60 
     return h.to_s + ':' + m.to_s 
    end 
    alias_method_chain :to_s, :time 
    end 
    } 
    logger.debug "Here's another #{455.67.to_s}" 

Und ich werde

Here is a float 455.67 
Here is another 7:35 

sehen Aber wenn ich den gleichen Code in einen Controller einfügen, ich sehe

Here is a float 455.67 
Here is another 455.67 

Warum kann ich Float.to_s nicht in einem Controller ersetzen? Ich werde auch Antworten auf die Frage "Was ist ein besserer Weg, dies zu erreichen?" Akzeptieren.

+0

I aufgewickelten Zugabe dieses (plus ein attr_accessor) mit dem "label" Verfahren in Gruff Basis, die vollständig funktioniert: wenn @is_minutes return „# {sprintf ('% 02i', value.to_i/60)} : # {sprintf ('% 02i', value.to_i% 60)} " Ende Ich möchte jedoch immer noch eine Lösung, die nicht einfrieren und dann das Plugin anpassen. –

+0

Warum erstellen Sie nicht einfach eine Methode, an die Sie den Float übergeben - warum müssen Sie Float selbst überladen? –

Antwort

1

Wenn Sie das Verhalten von Float # to_s ersetzen möchten, können Sie versuchen, Ihr Monkeypatch zur Float-Klasse in initializer hinzuzufügen. Dies wird Float # to_s jedoch global in Ihrer Rails-App patchen.

config/initializers/float_patch.rb:

class Float 
    def to_s 
    h = (self/60).to_i 
    m = self.to_i % 60 
    h.to_s + ':' + m.to_s 
    end 
end 

Sie auch eine ähnliche initializer machen könnte die schroffe Klassen/Methoden patchen, wenn Sie Sie wollen nicht so breit sein, wie eine Kernklasse patchen wie Float.

+0

Interessant, werde das später in Rails 4.2 testen – user1735921

Verwandte Themen