2010-12-14 12 views
1

In views/products/list.html.erb I verwenden:Ruby on Rails: Warum wird meine Klassenerweiterung nicht erkannt?

<%= product.power.power_in_kw.to_kw if ... %> 

to_kw in lib/my_extensions.rb zusammen mit anderen Methoden definiert ist:

class Symbol 
    def pluralize 
    to_s.pluralize.to_sym 
    end 
end 

class BigDecimal 
    def to_kw 
    number_to_currency(self, :unit => "kw", :format => "%n%u", :precision => 1) 
    end 
end 

class Float 
    def to_dollar 
    number_to_currency(self) 
    end 
end 

config/environment.rb die folgende Zeile am Ende hat:

require 'my_extensions' 

jedoch I habe den folgenden Fehler erhalten:

undefined method `to_kw' for #<BigDecimal:2704620,'0.555E2',8(8)> 

Was fehlt mir?

+0

Pluralisieren und floaten arbeiten? – Cory

+0

'pluralize' verwendet, um zu arbeiten. Dann fügte ich 'to_kw' und' to_dollar' hinzu und es fing an zu scheitern. –

Antwort

1

Sie sollten ActionView::Helpers::NumberHelper in Ihrem BigDecimal und Float umfassen:

class BigDecimal 
    include ActionView::Helpers::NumberHelper 
    def to_kw 
    number_to_currency(self, :unit => "kw", :format => "%n%u", :precision => 1) 
    end 
end 

class Float 
    include ActionView::Helpers::NumberHelper 
    def to_dollar 
    number_to_currency(self) 
    end 
end 

Ich denke, der Fehler undefined method to_kwnumber_to_currency durch die nicht definierte Methode verursacht wird.

+0

Auch wenn dies das unmittelbare Problem löst, scheint es nicht in Ordnung zu sein, jedem einzelnen float oder bignumber, das jemals existiert, 7 Instanzmethoden hinzuzufügen, die nicht einmal auf die relevante Instanz einwirken:/Auch die untergeordnete Methode ist nicht definiert. t einen Fehler bei der übergeordneten Methode verursachen, der im Backtrace nicht definiert ist. Ruby ist ein bisschen schlauer als das. – Matchu

+0

Ja, wenn ich dieses Problem hätte, würde ich eine View-Hilfsmethode definieren, anstatt diese Klassen zu erweitern, aber es geht über diese Frage hinaus. Ich frage mich auch, warum der Fehler sagt undefined 'to_kw' während nicht' number_to_currency', ich habe es noch nicht herausgefunden. – Kevin

2

Ich weiß, dass es schon Stunden her ist, dass Sie dies eingereicht haben, aber diese Funktionen funktionieren möglicherweise, wenn Sie Ihre App neu starten. Elemente in lib werden im Allgemeinen nicht automatisch wie die in app neu geladen. Daher werden Änderungen erst dann in der Anwendung angezeigt, wenn ein vollständiger Neustart durchgeführt wird.

werfen Sie es einfach da draußen :)

Ich werde auch darauf hinweisen, dass, sobald Sie diese Methoden und läuft, werden sie wahrscheinlich nicht sofort funktionieren. Dies liegt daran, dass Ihre Ansichten im Kontext aller Rails-Ansichtshelfer definiert sind, z. B. ActionView::Helpers::NumberHelper, die number_to_currency definiert. Ihre Erweiterung in lib ist jedoch in einem solchen Kontext nicht definiert und kann daher nicht auf diese Helfer zugreifen.

ActionView::Helpers::NumberHelper.number_to_currency könnte eher funktionieren als erwartet.