2010-12-17 6 views
6

que tienen una validación simple:Rails: ¿Por qué no se reconoce el método "number_with_delimiter" dentro de mi modelo?

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 

En este código, he recibido el siguiente error:

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

He intentado añadir:

include ActionView::Helpers::NumberHelper 

pero no lo hizo ayuda.

¿Qué me estoy perdiendo?

Respuesta

10

El verdadero problema aquí es que se está incluyendo este módulo en la clase, en lugar de la clase extendida con él.

Las diferencias se incluirán y harán que los métodos estén disponibles en la instancia, mientras que la extensión los hará donde intenta utilizarlos: en la clase.

+0

@Ryan: entiendo que incluir dentro de la clase es equivalente a definir mis propios métodos en esta clase, ¿verdad? ¿Esto significa que podría usar 'self.number_with_delimiter (...)'? Cuando coloca el 'include' fuera de la clase, ¿todos los métodos dentro de' ActionView :: Helpers :: NumberHelper' se vuelven globales? –

+0

@Misha: Sí, se convertirían en globales, pero eso generalmente no es una buena idea (tm). Lo mejor que se puede hacer en este caso es "extender" la clase con el módulo. –

+0

@Ryan: ¿Extender qué clase? –

2

Es posible que se pierda la dependencia ... es la clase NumberHelper accesible para su aplicación?

Comprobar la official Rails docs

+0

Muchas gracias! –

3

Debe utilizar extender:

Uso: extend ActionView::Helpers::NumberHelper

Es bueno para mí

0

En lugar de extender ActionView módulo. Puede utilizar los métodos de ActiveSupport lugar

Por ejemplo:

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

+1

es mejor desde el punto de vista del rendimiento en términos de uso de la memoria? – Ninjaxor

Cuestiones relacionadas