ASCIUGATURA Viste in Rotaie (number_to_currency)
-
05-07-2019 - |
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?
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 => "£")
end