Domanda

Ho un codice simile a:

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

sporcare le mie opinioni in vari modelli. Poiché la mia applicazione si occupa solo in GBP (£), non dovrei spostarlo in ciascuno dei miei modelli in modo che line_item.price restituisca la stringa come dovrebbe essere (cioè number_to_currency (line_item.price ,: unit = > " £ ") e line_item.price sono gli stessi. Sto pensando che per farlo dovrei:

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

ma questo non funziona. Se price è già definito nel modello, Rails segnala 'livello di stack troppo profondo', quando cambio def price in def amount , quindi si lamenta che number_to_currency non è definito?

È stato utile?

Soluzione

number_to_currency è un helper di visualizzazione, quindi non è disponibile nei modelli.

È possibile salvare alcuni tasti premendo il proprio helper in application_helper.rb (quindi è disponibile per tutte le viste). Ad esempio,

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

Quindi chiamalo nelle visualizzazioni:

quid(line_item.price)

Altri suggerimenti

Se si desidera modificare l'impostazione predefinita per l'intera applicazione, è possibile modificare config / locales / en.yml

Il mio è simile al seguente:

# 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

Tutto tranne l'unità è opzionale e tornerà al valore predefinito, ma lo inserisco in modo da sapere quali valori posso cambiare. puoi anche utilizzare il & # 163; segno invece di & amp; pound ;.

La ragione dell'errore livello di stack troppo profondo è che quando dici self.price nel metodo price stai creando un infinito chiamata ricorsiva al tuo metodo di prezzo in quanto ora hai ignorato il normale metodo di accesso. Per evitare ciò, è necessario accedere al valore del campo del prezzo utilizzando l'hash degli attributi. per esempio. qualcosa come:

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

eccetto per il fatto che number_to_currency non è disponibile nel codice modello per il motivo descritto da Larry K.

Ecco il mio approccio a questo problema ..

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

nei tuoi modelli puoi farlo (e non inquinerai il tuo modello con metodi che non utilizzerai)

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

  def price
    currency_to_number(amount)
  end
end

quindi, affinché tutte le tue visualizzazioni siano aggiornate, includi il modulo in uno dei tuoi helper per app

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

Ora, ovunque tu usi il numero per aiutare la valuta, questo sarà formattato con un simbolo di sterlina, ma hai anche tutta la flessibilità del metodo delle rotaie originale in modo da poter passare le opzioni come facevi prima.

number_to_currency(amount, :unit => '

lo convertirà nuovamente in un simbolo del dollaro.

)

lo convertirà nuovamente in un simbolo del dollaro.

L'altra risposta relativa alla richiesta di un altro metodo helper (prezzo) per semplificare la ripetizione è probabilmente l'approccio migliore .. tuttavia .. se si desidera VERAMENTE accedere agli helper del modello, è possibile fare qualcosa del tipo:

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

allora dovresti essere in grado di farlo nella classe del modello:

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

A partire da Rails 3

Come descrive Larry K ma con questa modifica:

def quid(price)
   number_to_currency(price, :unit => "&pound;")
 end
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top