Trocknungsansichten in Rails (Number_to_Currency)
-
05-07-2019 - |
Frage
Ich habe einen ähnlichen Code wie:
number_to_currency(line_item.price, :unit => "£")
Ich bin meine Ansichten in verschiedenen Modellen ab. Da meine Bewerbung nur in GBP (£) befasst ist, sollte ich dies nicht in jedes meiner Modelle bewegen, damit das line_item.price
Gibt die Zeichenfolge zurück, 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:
def price
number_to_currency(self.price, :unit => "£")
end
Aber das funktioniert nicht. Wenn price
ist bereits im Modell definiert, dann berichtet Rails "Stack Level zu tief", wenn ich mich verändere def price
zu def amount
, dann beschwert es sich das number_to_currency
ist nicht definiert?
Lösung
number_to_currency ist ein Ansichtshelfer, daher ist er in Modellen nicht verfügbar.
Sie können einige wichtige Striche speichern, indem Sie Ihren eigenen Helfer in application_helper.rb definieren (damit er allen Ansichten zur Verfügung steht). Z.B
def quid(price)
number_to_currency(price, :unit => "£")
end
Rufen Sie es dann in Ansichten an:
quid(line_item.price)
Andere Tipps
Wenn Sie die Standardeinstellung für Ihre gesamte Anwendung ändern möchten, können Sie die Konfiguration/Orte/en.yml bearbeiten
Meins sieht so aus:
# 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: "£"
# These three are to override number.format and are optional
separator: "."
delimiter: ","
precision: 2
Alles außer dem Gerät ist optional und fällt auf die Standardeinstellung zurück, aber ich habe es eingegeben, damit ich weiß, welche Werte ich ändern kann. Sie können das £ Zeichen auch anstelle von £ verwenden.
Der Grund für die Stack Level zu tief Fehler ist das, wenn Sie sagen self.price
in dem price
Methode Sie erstellen einen unendlichen rekursiven Aufruf Ihrer Preismethode, da Sie jetzt die normale Accessor -Methode überschrieben haben. Um dies zu vermeiden, müssen Sie mit dem Attribute Hash auf den Wert des Preisfelds zugreifen. ZB so etwas wie:
def price
number_to_currency(attributes['price'], :unit => "£")
end
außer der Tatsache, dass number_to_currency
ist nicht im Modellcode verfügbar, aus dem Grund, warum Larry K beschreibt.
Hier war mein Ansatz zu diesem 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 können Sie dies tun (und Sie werden Ihr Modell nicht mit Methoden verschmutzen, die Sie nicht verwenden werden)
class Album < ActiveRecord::Base
include AppName::CurrencyHelper
def price
currency_to_number(amount)
end
end
Dann geben Sie das Modul in einem Ihrer App -Helper auf, damit Ihre Ansichten alle aktualisiert werden sollen
module ApplicationHelper
# change default currency formatting to pounds..
include AppName::CurrencyHelper
end
Überall, wo Sie die Nummer zum Währungshelfer verwenden, wird sie mit einem Pfundsymbol formatiert, aber Sie haben auch die gesamte Flexibilität der ursprünglichen Rails -Methode, damit Sie die Optionen wie zuvor eingeben können.
number_to_currency(amount, :unit => '$')
Wird es wieder in ein Dollarsymbol umwandeln.
The other answer regarding making another helper method quid(price) to simplify the repetition is probably the best approach.. however.. if you REALLY want to access view helpers in the model you can do something like:
# /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
then you should be able to do this in the model class:
def price
helper = YourNamespace::Helper.instance
helper.number_to_currency(read_attribute('price'), :unit => "£")
end
As of Rails 3
As Larry K describes but with this edit:
def quid(price)
number_to_currency(price, :unit => "£")
end