Ich denke, es gibt viele Produkte, die Geld mit [RubyMoney] verwalten (https://github.com/RubyMoney/money). RubyMoney bietet standardmäßig eine Währungseinstellung. Sie können diese Einstellung jedoch überschreiben, wenn Sie dies wünschen. Auf vielen Systemen werden Sie die Einstellungen nach dem Festlegen der Einstellungen beim Erstellen der App wahrscheinlich nicht mehr nachträglich ändern. Im Rahmen von Tests möchten Sie die Einstellungen jedoch initialisieren, sobald Sie sie geändert haben. Gibt es nicht
In diesem Artikel werde ich erklären, wie die Währungseinstellung von RubyMoney in einem solchen Fall initialisiert wird.
Stellen Sie als Voraussetzung die Währung wie folgt ein.
cad = Money::Currency.find(:cad)
cad.name # => Canadian Dollar
Money::Currency.register(
:priority => cad.priority,
:iso_code => cad.iso_code,
:name => 'Something Different',
:subunit => cad.subunit,
:subunit_to_unit => cad.subunit_to_unit,
:thousands_separator => cad.thousands_separator,
:decimal_mark => cad.decimal_mark
)
cad = Money::Currency.find(:cad)
cad.name # => Something Different
Die Klasse "Money :: Currency" verwaltet die Währungseinstellungen mit einer Instanzvariablen namens "@ table". Daher wäre es schön, wenn diese Instanzvariable zurückgesetzt werden könnte. Aufgrund der Spezifikationen können Sie jedoch nicht direkt auf "@ table" zugreifen. Initialisieren Sie es daher wie folgt.
Money::Currency.instance_variable_set('@table', nil)
Money::Currency.table # => reloading the initial setting
Es ist einfach. Selbst nach Durchführung der obigen Initialisierung erhalte ich den überschriebenen Wert.
cad = Money::Currency.find(:cad)
cad.name # => Something Different
Money::Currency.instance_variable_set('@table', nil)
Money::Currency.table
cad = Money::Currency.find(:cad)
cad.name # => Something Different.Nicht initialisiert!
Folgen Sie der Implementierung der Bibliothek im Detail, um die Antwort zu finden. Nach der Änderung müssen die Einstellungen nach dem Start der Anwendung konsistent sein, dh vom Beginn des Ruby-Prozesses bis zum Ende dieses Prozesses.
Um diese Spezifikation zu implementieren, verwaltet Money :: Currency
auch die Instanz selbst als Klassenvariable.
Auf diese Weise müssen wir uns als Bibliotheksbenutzer nicht um die in der Entwicklung befindlichen Einstellungen kümmern.
In diesem Sinne ist der verbesserte Code unten.
cad.name # => Something Different
Money::Currency.class_variable_set('@@instances', {})
Money::Currency.instance_variable_set('@table', nil)
Money::Currency.table
cad = Money::Currency.find(:cad)
cad.name # => Canadian Dollar
Es wurde erfolgreich initialisiert. Wenn Sie diesen Code in spec_helper usw. schreiben, können Sie den Test garantieren, der nicht von der Überschreibung der Einstellung von "Money :: Currency" abhängt.
Das Schreiben dieser Einstellung ist jedoch mühsam. Tatsächlich bietet der neueste RubyMoney :: Money-Master eine API Money :: Currency.reset!, Um diese Initialisierung durchzuführen. Dies ist die Pull-Anforderung für diese Änderung. Wenn Sie diese Funktion verwenden möchten, installieren Sie bitte den neuesten Master. Wir hoffen, dass die nächste aktualisierte Version von "RubyMoney :: Money" bald veröffentlicht wird.
Die englische Version ist hier
Recommended Posts