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?

War es hilfreich?

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 => "&pound;")
 end
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top