2012-04-07 17 views
5

Estoy haciendo una solución de comercio minorista simple, donde hay precios en algunos modelos diferentes. Estos precios contribuyen a un precio total . Imagínese pagar $ 0.30 más por seleccionar un aderezo para su yogurt.Rieles - Formato de número como formato de moneda en el Getter

Cuando defina el campo price a

t.decimal :price, precision:8, scale:2 

Los datos almacena 6.50 como 6.5. Sé de manera estándar los rieles, llame al number_to_currency(price) para obtener el valor formateado en las Vistas. Necesito llamar programáticamente al campo price como una cadena con formato, es decir, $ 6.50 unos pocos lugares que no son directamente parte de la Vista. Además, mis necesidades son simples (no hay conversión de moneda, etc.), prefiero que el precio se formatee universalmente en el modelo sin repetidas llamadas number_to_currency en las vistas.

¿Hay alguna manera de modificar mi buscador de forma tal que siempre devuelva dos cifras decimales con un signo de dólar, es decir, $ 6.50 cuando se llame?

Gracias de antemano.

ACTUALIZACIÓN

Gracias a todos.

He elegido utilizar el enfoque de Alex porque parece muy 'hackish' hacer las inclusiones solo para formatear el número. Usando su enfoque, lo hice:

def price_change=(val) 
     write_attribute :price_change, val.to_s.gsub(/[\$]/,'').to_d 
    end 

    def price_change 
    "$%.2f" % self[:price_change] 
    end 

Saludos.

ACTUALIZACIÓN 2

caveat.emptor. Una vez que haces esto, pierdes la capacidad de hacer operaciones al número porque ahora es una cadena.

Tenga cuidado si alguien se enfrenta al mismo problema que yo.

Respuesta

12

Sólo añadir un método en el modelo que se nombra como su atributo en la base de datos como:

def price 
    "$%.2f" % self[:price] 
end 

que le da un control total sobre el formateo o el uso del método de ayuda proporcionado Rails

def price 
    ActionController::Base.helpers.number_to_currency(self[:price]) 
end 

esto debería hacer el truco. Espero que ayude!

+1

Gracias! Estaba pensando que debe haber un formato de número incorporado. Un poco cauteloso de incluir ActionView o ActionController en el modelo. –

+0

El problema con esto es que no puedes usar el precio como un número, es una cadena en todas partes. Estoy buscando una manera de hacer que el rails helper lo convierta de esta manera en el to_s – Joelio

-1

tratar

include ActionView::Helpers::NumberHelper 

a su modelo

1

Sugeriría ir con un enfoque de presentador, como Draper (ver this reailscast).

Otra solución sería implementar su propio método en su modelo, es decir, formatted_price y hacer el formateo por su cuenta (es decir, con el módulo ActionView::Helpers::NumberHelper).Pero dado que los modelos representan los datos simples en su aplicación de rieles, es algo sospechoso hacer algo como esto e interfiere con el enfoque de la convención sobre la configuración, creo.

2

Puede utilizar el módulo de ayudantes, pero no debe incluir todo el módulo, porque incluye muchos métodos que puede que realmente no necesite o anule algunos de los suyos. Pero se puede utilizar directamente:

ActionController::Base.helpers.number_to_currency(6.5) 
#=> "$6.50" 

También podría definir un método para los ayudantes, para que pueda utilizarlos fácilmente.

def helpers 
    ActionController::Base.helpers 
end 

"#{helpers.number_to_currency(6.5)}" 

Tener un vistazo a este railscast

+0

Gracias hombre. Al igual que arriba, un poco cauteloso de esto, parece romper MVC. De hecho, probaré ambos =) –