2009-09-09 5 views
9

Ich habe Code ähnlich:Trocknungs Ansichten in Rails (number_to_currency)

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

meine Ansichten in verschiedenen Modellen Littering. Da meine Anwendung nur in GBP (£) behandelt, sollte ich diese nicht in jedes meiner Modelle verschieben, so dass line_item.price die Zeichenfolge so zurückgibt, wie sie sein sollte (dh number_to_currency(line_item.price, :unit => "£") und line_item.price sind gleich. Ich denke, dass ich das tun sollte, um dies zu tun :.

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

aber das funktioniert nicht, wenn price bereits im Modell definiert ist, dann Rails Berichte ‚Stack-Ebene zu tief‘, wenn ich def price-def amount ändern, dann wirft sie number_to_currency nicht definiert ist?

+1

Ist es nicht mehr DRY, wenn Sie nur die Standard-Einheit auf GBP einstellen könnte und number_to_currency direkt benutzen? –

Antwort

12

number_to_currency ist ein View-Helfer, daher in Modellen nicht verfügbar

Sie könnten einige Schlüsselstriche speichern, indem Sie in application_helper.rb Ihren eigenen Helfer definieren (damit er für alle Ansichten verfügbar ist). ZB

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

Dann ist es in Ansichten nennen:

quid(line_item.price) 
6

Der Grund für die Stack-Ebene zu tief Fehlern ist, dass, wenn Sie sagen self.price in price Methode Sie einen unendlichen rekursiven Aufruf erstellen zu Ihre Preismethode, da Sie die normale Zugriffsmethode jetzt außer Kraft gesetzt haben. Um dies zu vermeiden, müssten Sie den Wert des Preisfeldes mit dem Attribut-Hash aufrufen. z.B. so etwas wie:

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

mit Ausnahme der Tatsache, dass number_to_currency aus dem Grunde, Larry K beschreibt in Modell-Code nicht verfügbar ist.

+0

Vielen Dank für die Erklärung der rekursiven Aufruf Bit zu mir. – Gav

1

Die andere Antwort in Bezug auf eine weitere Hilfsmethode quid machen (Preis), um die Wiederholung zu vereinfachen ist wahrscheinlich der beste Ansatz .. aber .. wenn man wirklich View Helfer im Modell zugreifen wollen Sie so etwas wie tun:

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

dann sollten Sie in der Lage sein, dies in der Modellklasse zu tun:

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

war hier mein Ansatz für dieses Problem ..

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

in Ihren Modellen Sie können dies tun (und Sie werden Ihr Modell nicht mit Methoden verschmutzen Sie gehen nicht zu verwenden)

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

    def price 
    currency_to_number(amount) 
    end 
end 

dann für Ihre Ansichten zu allen aktualisiert werden können, schließen Sie das Modul in einem Ihrer App Helfer

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

Jetzt überall verwenden Sie die Nummer Währung Helfer wird es mit einem Rautenzeichen formatiert, aber Sie haben auch alle flexiblity der ursprünglichen Schienen-Methode, so dass Sie in den Optionen, wie Sie weitergeben können tat vorher ..

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

wird es zurück in ein Dollarsymbol umwandeln.

41

Wenn Sie die Standardeinstellung für die gesamte Anwendung ändern möchten, können Sie config/locales/en.yml

-Mine sieht wie folgt bearbeiten:

# 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 

Alles, außer das Gerät ist optional und wird zurückfallen, aber ich habe es eingegeben, damit ich weiß, welche Werte ich ändern kann. Sie könnten auch das £ -Zeichen anstelle von & Pfund verwenden.

+0

Danke für den Tipp; Die Rails-API-Dokumentation für 'ActionView :: Helpers :: NumberHelper number_to_currency()' gibt ein Beispiel, in dem die Einstellung ': locale =>" fr "' die Position des Trennzeichens und des Trennzeichens und des Währungssymbols ändert. Dies funktionierte nicht für mich, aber durch Hinzufügen einer 'config/locales/fr.yml' mit Einstellungen wie oben, es begann zu arbeiten. – bjnord

+2

Ich habe immer einen benutzerdefinierten Helfer verwendet, ähnlich wie Larry Ks akzeptierte Antwort beschreibt, aber das ist viel sauberer. –

1

Ab Rails 3

Als Larry K beschreibt aber mit dieser edit:

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