2009-09-09 6 views
9

que tienen un código similar a:secado en rieles (number_to_currency)

number_to_currency(line_item.price, :unit => "£")

ensuciando mis puntos de vista en varios modelos. Como mi aplicación solo trata en GBP (£), ¿no debería mover esto a cada uno de mis modelos para que line_item.price devuelva la cadena como debería (es decir, number_to_currency(line_item.price, :unit => "£") y line_item.price son lo mismo. Estoy pensando que para hacer esto debería :.

def price 
number_to_currency(self.price, :unit => "£") 
end 

pero esto no funciona Si price ya está definido en el modelo, entonces Rails nivel de pila demasiado profundo 'informes, cuando cambio def price-def amount, entonces se queja de que number_to_currency no está definido?

+1

no es más seco si sólo pudiera establecer la unidad por defecto a GBP y utilizar number_to_currency directamente? –

Respuesta

12

number_to_currency es un ayudante de visualización, por lo que no está disponible en los modelos.

Puede guardar algunos trazos de tecla definiendo su propio helper en application_helper.rb (para que esté disponible para todas las vistas). Por ejemplo

def quid(price) 
    number_to_currency(price, :unit => "£") 
end 

Entonces llamarlo en las vistas:

quid(line_item.price) 
6

La razón para el nivel pila demasiado profundo error es que cuando se dice self.price en el método price está creando una llamada recursiva infinita de su método de precio ya que ahora ha anulado el método de acceso normal. Para evitar esto, necesitarás acceder al valor del campo de precio usando los atributos hash. p.ej. algo así como:

def price 
number_to_currency(attributes['price'], :unit => "£") 
end 

excepto por el hecho de que number_to_currency no está disponible en el modelo de código por la razón Larry K describe.

+0

Gracias por explicarme el bit de llamada recursiva. – Gav

1

La otra respuesta en cuanto a hacer otro método de ayuda libras (precio) para simplificar la repetición es probablemente el mejor enfoque .. .. Sin embargo, si usted realmente desea acceder ayudantes de vista en el modelo que usted puede hacer algo como:

# /RAILS_ROOT/lib/your_namespace/helper.rb 
# 
# Need to access helpers in the model? 
# YourNamespace::Helper.instance.helper_method_name 
module YourNamespace 
    class Helper 
    include Singleton 
    include ActionView::Helpers 
    end 
end 

, entonces debería ser capaz de hacer esto en la clase del modelo:

def price 
    helper = YourNamespace::Helper.instance 
    helper.number_to_currency(read_attribute('price'), :unit => "£") 
end 
2

Aquí estaba mi acercamiento a este problema ..

# /RAILS_ROOT/lib/app_name/currency_helper.rb 
module AppName 
    module CurrencyHelper  

    include ActionView::Helpers::NumberHelper 

    def number_to_currency_with_pound(amount, options = {}) 
     options.reverse_merge!({ :unit => '£' }) 
     number_to_currency_without_pound(amount, options) 
    end 

    alias_method_chain :number_to_currency, :pound 

    end 
end 

en sus modelos se puede hacer esto (y no se contamina su modelo con métodos que no se va a utilizar)

class Album < ActiveRecord::Base 
    include AppName::CurrencyHelper 

    def price 
    currency_to_number(amount) 
    end 
end 

a continuación para sus puntos de vista a todos actualizarse incluir el módulo en una la de los ayudantes de aplicaciones

module ApplicationHelper 
    # change default currency formatting to pounds.. 
    include AppName::CurrencyHelper 
end 

Ahora todas partes que utilizar el número para ayudante de la moneda será formateado con un símbolo de la libra, pero también tienes toda la FLEXIBILIDAD del método rieles original, por lo que puede pasar en las opciones que se lo hizo antes ..

number_to_currency(amount, :unit => '$') 

lo convertirá de nuevo en un símbolo de dólar.

41

Si desea cambiar el valor predeterminado para toda la aplicación, se puede editar config/lugares/en.yml

mina se parece a esto:

# Sample localization file for English. Add more files in this directory for other locales. 
# See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points. 
"en": 
    number: 
    currency: 
     format: 
      format: "%u%n" 
      unit: "&pound;" 
      # These three are to override number.format and are optional 
      separator: "." 
      delimiter: "," 
      precision: 2 

Todo, excepto la unidad es opcional y se volver al predeterminado, pero lo puse para saber qué valores puedo cambiar. también puede usar el signo £ en lugar de & libra ;.

+0

Gracias por la propina; la documentación de la API de Rails para 'ActionView :: Helpers :: NumberHelper number_to_currency()' da un ejemplo donde la configuración ': locale =>" fr "' cambia el separador y el delimitador y la posición del símbolo de moneda. Esto no funcionaba para mí, pero al agregar un 'config/locales/fr.yml' con configuraciones como las de arriba, comenzó a funcionar. – bjnord

+2

Siempre había usado una ayuda personalizada, similar a la descripción de la respuesta aceptada por Larry K, pero esto es mucho más limpio. –

1

A partir de los carriles 3

como Larry K describe pero con esta edición:

def quid(price) 
    number_to_currency(price, :unit => "&pound;") 
end