2010-12-17 6 views
6

ich eine einfache Validierung haben:Schienen: Warum wird die Methode "number_with_delimiter" in meinem Modell nicht erkannt?

class Product < ActiveRecord::Base 
    # include ActionView::Helpers::NumberHelper 
    ... 
    validates_numericality_of :price, :less_than => 1000000, 
          :message => "must be less than #{number_with_delimiter(1000000)}"      
    ... 
end 

Auf diesem Code habe ich den folgenden Fehler erhalten:

undefined method `number_with_delimiter' for #<Class:0x2665a58> 

Ich habe versucht, hinzuzufügen:

include ActionView::Helpers::NumberHelper 

aber es hat nicht Hilfe.

Was fehlt mir?

Antwort

10

Das wahre Problem ist, dass Sie dieses Modul in der Klasse sind, einschließlich, anstatt die Klasse mit ihm verlängert.

Die Unterschiede ist ein Include wird die Methoden für die Instanz verfügbar machen, wo die Erweiterung sie dorthin bringt, wo Sie sie benutzen wollen: auf der Klasse.

+0

@Ryan: Ich verstehe, dass das Einschließen in die Klasse der Definition meiner eigenen Methoden in dieser Klasse entspricht, oder? Bedeutet das, dass ich 'self.number_with_delimiter (...)' verwenden könnte? Wenn Sie das 'include' außerhalb der Klasse platzieren, werden alle Methoden innerhalb von 'ActionView :: Helpers :: NumberHelper' global? –

+0

@Misha: Ja, sie würden global werden, aber das ist im Allgemeinen keine gute Idee (tm). In diesem Fall ist es am besten, die Klasse mit dem Modul zu erweitern. –

+0

@Ryan: Verlängern welche Klasse? –

2

Möglicherweise fehlt Ihnen die Abhängigkeit ... ist die NumberHelper-Klasse für Ihre Anwendung zugänglich?

Überprüfen Sie die official Rails docs

+0

Vielen Dank! –

3

sollten Sie verwenden erweitern:

Verbrauch: extend ActionView::Helpers::NumberHelper

Es ist gut für mich

0

Statt ActionView Modul zu erweitern. Sie können Methoden von ActiveSupport anstelle

Zum Beispiel:

ActiveSupport::NumberHelper::number_to_currency(10000.1234,{precision: 2,unit: ''})

+1

ist das vom Performance-Standpunkt in Bezug auf die Speichernutzung besser? – Ninjaxor