2010-12-17 26 views
6

Ben basit doğrulama vardır: Bu kodun üzerindeRaylar: Modelimde neden "number_with_delimiter" yöntemi tanınmadı?

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 

, aşağıdaki hatayı aldık:

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

ben eklemek için çalıştı:

include ActionView::Helpers::NumberHelper 

ama etmedi yardım et.

Neyi eksik?

cevap

10

gerçek sorun sınıfa bu modülü dahil yerine onunla sınıfı genişletilmiş olmamız.

Buradaki farklar, yöntemleri, örnekte kullanılabilir hale getirecek ve uzantı onları kullanmaya çalıştığınız yer haline getirecektir: sınıfta.

+0

@Ryan: Sınıfın içinde yer almanın kendi sınıflarımı bu sınıfta tanımlamaya eşdeğer olduğunu anlıyorum, değil mi? Bu, 'self.number_with_delimiter (...)' ı kullanabileceğim anlamına mı geliyor? 'Include' sınıfının dışına koyduğunuzda, ActionView :: Helpers :: NumberHelper 'içindeki tüm yöntemler global hale gelir mi? –

+0

@Misha: Evet, küresel hale geldiler ama bu genellikle iyi bir fikir değil (tm). Bu durumda yapılacak en iyi şey, sınıfı modül ile genişletmektir. –

+0

@Ryan: Hangi sınıfı genişletirsiniz? –

2

Bağımlılığı kaçırıyor olabilirsiniz ... uygulamanız için erişilebilir olan NumberHelper sınıfı nedir? Burada

Kontrol official Rails docs

+0

çok teşekkür ederiz! –

3

Sen uzatmak kullanmalıdır:

Kullanımı: extend ActionView::Helpers::NumberHelper

Benim

0

yerine ActionView modülünü uzanan için iyidir. Sen Örneğin ActiveSupport yerine

gelen yöntemleri kullanabilirsiniz:

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

+1

, bellek kullanımı açısından performans açısından daha mı iyi? – Ninjaxor

İlgili konular