2009-09-09 8 views
9

J'ai un code similaire à:Vues dans Rails SECHAGE (number_to_currency)

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

jonchent mon point de vue dans différents modèles. Puisque mon application traite seulement en GBP (£), devrais-je ne pas déplacer ceci dans chacun de mes modèles afin que line_item.price renvoie la chaîne comme il se doit (c'est-à-dire number_to_currency(line_item.price, :unit => "£") et line_item.price sont les mêmes.Je pense que pour ce faire, je devrais :.

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

mais cela ne fonctionne pas si price est déjà défini dans le modèle, puis Rails de niveau de pile trop profond »des rapports, quand je change def price-def amount, il se plaint que number_to_currency ne définit pas?

+1

est-il pas plus sec si vous pouvez simplement mettre l'unité par défaut GBP et utiliser number_to_currency directement? –

Répondre

12

number_to_currency est une aide à la vue, elle n'est donc pas disponible dans les modèles

Vous pouvez enregistrer certains traits de touches en définissant votre propre assistant dans application_helper.rb (il est donc disponible pour toutes les vues). Par exemple,

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

Ensuite, appelez en vue:

quid(line_item.price) 
6

La raison du niveau de pile trop profond d'erreur est que lorsque vous dites self.price dans la méthode price vous créez un appel récursif infini votre méthode de prix comme vous avez maintenant remplacé la méthode d'accesseur normale. Pour éviter cela, vous devrez accéder à la valeur du champ de prix en utilisant le hachage des attributs. par exemple. quelque chose comme:

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

à l'exception du fait que number_to_currency n'est pas disponible dans le code de modèle pour la raison Larry K décrit.

+0

Merci d'avoir expliqué l'appel récursif à moi. – Gav

1

L'autre réponse au sujet de faire un autre quid de la méthode d'aide (prix) pour simplifier la répétition est probablement la meilleure approche .. mais .. si vous voulez vraiment accéder à des aides de vue dans le modèle que vous pouvez faire quelque chose comme:

# /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 

alors vous devriez être en mesure de le faire dans la classe modèle:

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

Voici mon approche était à ce problème ..

# /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 

dans vos modèles, vous pouvez le faire (et vous ne serez pas polluer votre modèle avec des méthodes que vous ne comptez pas utiliser)

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

    def price 
    currency_to_number(amount) 
    end 
end 

alors votre point de vue à être mises à jour comprennent le module dans un de vos aides d'applications

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

maintenant, partout où vous utilisez le numéro d'aide de la monnaie, il sera formaté avec un symbole dièse, mais vous avez aussi tous les flexiblity de la méthode des rails d'origine afin que vous puissiez passer dans les options que vous a fait avant ..

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

le convertira en symbole dollar.

41

Si vous voulez changer la valeur par défaut pour votre application entière, vous pouvez modifier config/locales/en.yml

mine ressemble à ceci:

# 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 

Tout sauf l'unité est facultative et retombez à la valeur par défaut, mais je l'ai mis pour que je sache quelles valeurs je peux changer. vous pouvez également utiliser le signe £ au lieu de & pound ;.

+0

Merci pour le conseil; la documentation de l'API Rails pour 'ActionView :: Helpers :: NumberHelper number_to_currency()' donne un exemple où la configuration ': locale =>" fr "' change la position du séparateur et du délimiteur et du symbole monétaire. Cela ne fonctionnait pas pour moi, mais en ajoutant un 'config/locales/fr.yml' avec des paramètres comme ci-dessus, il a commencé à fonctionner. – bjnord

+2

J'avais toujours utilisé une aide personnalisée, semblable à la réponse acceptée par Larry K, mais elle est beaucoup plus propre. –

1

À partir de Rails 3

Comme Larry K décrit mais avec cette édition:

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