وجهات نظر التجفيف في القضبان (number_to_currency)
-
05-07-2019 - |
سؤال
لدي رمز مشابه لـ:
number_to_currency(line_item.price, :unit => "£")
القمامة آرائي في نماذج مختلفة. نظرًا لأن طلبي يتعامل فقط مع GBP (£) ، فهل يجب ألا أقود هذا إلى كل طراز من طرازاتي line_item.price
إرجاع السلسلة كما ينبغي (أي number_to_currency(line_item.price, :unit => "£")
و line_item.price
هي نفسها. أفكر في أن أفعل هذا ، يجب أن:
def price
number_to_currency(self.price, :unit => "£")
end
لكن هذا لا يعمل. إذا price
تم تعريفه بالفعل في النموذج ، ثم تقارير Rails "مستوى المكدس عميقًا جدًا" ، عندما أتغير def price
إلى def amount
, ثم يشكو ذلك number_to_currency
غير محدد؟
المحلول
Number_to_currency هو مساعد عرض ، لذلك لا يتوفر في النماذج.
يمكنك حفظ بعض السكتات الدماغية الرئيسية عن طريق تحديد المساعد الخاص بك في application_helper.rb (بحيث يكون متاحًا لجميع المشاهدات). على سبيل المثال
def quid(price)
number_to_currency(price, :unit => "£")
end
ثم نسميها في وجهات النظر:
quid(line_item.price)
نصائح أخرى
إذا كنت ترغب في تغيير الافتراضي لتطبيقك بالكامل ، فيمكنك تحرير config/standes/en.yml
يبدو لي هكذا:
# 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
كل شيء ما عدا الوحدة اختياري وسيعود إلى الإعداد الافتراضي ، لكنني أضعه حتى أعرف القيم التي يمكنني تغييرها. يمكنك أيضًا استخدام علامة £ بدلاً من £.
سبب مستوى المكدس عميق جدا الخطأ هو أنه عندما تقول self.price
في ال price
الطريقة التي تقوم بإنشائها مكالمة متكررة لا حصر لها لطريقة الأسعار الخاصة بك ، حيث تجاوزت الآن طريقة الإكسسور العادية. لتجنب ذلك ، ستحتاج إلى الوصول إلى قيمة حقل السعر باستخدام تجزئة السمات. مثل شيء مثل:
def price
number_to_currency(attributes['price'], :unit => "£")
end
باستثناء حقيقة أن number_to_currency
غير متوفر في رمز النموذج لسبب يصفه لاري ك.
كان هذا مقاربي في هذه المشكلة ..
# /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
في النماذج الخاصة بك ، يمكنك القيام بذلك (ولن تملأ النموذج الخاص بك بالطرق التي لن تستخدمها)
class Album < ActiveRecord::Base
include AppName::CurrencyHelper
def price
currency_to_number(amount)
end
end
ثم لكي يتم تحديث وجهات نظرك جميعًا ، قم بتضمين الوحدة النمطية في أحد مساعدي التطبيق الخاصة بك
module ApplicationHelper
# change default currency formatting to pounds..
include AppName::CurrencyHelper
end
الآن في كل مكان تستخدمه الرقم إلى مساعد العملة ، سيتم تنسيقه برمز جنيه ، ولكن لديك أيضًا جميع المرونة في طريقة القضبان الأصلية حتى تتمكن من المرور في الخيارات كما فعلت من قبل ..
number_to_currency(amount, :unit => '$')
سوف يحولها مرة أخرى إلى رمز الدولار.
الإجابة الأخرى المتعلقة بعمل طريقة مساعدة أخرى Quid (السعر) لتبسيط التكرار ربما تكون أفضل طريقة .. ومع ذلك .. إذا كنت تريد حقًا الوصول إلى مساعدي عرض في النموذج ، يمكنك القيام بشيء مثل:
# /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
ثم يجب أن تكون قادرًا على القيام بذلك في فئة النماذج:
def price
helper = YourNamespace::Helper.instance
helper.number_to_currency(read_attribute('price'), :unit => "£")
end
اعتبارا من القضبان 3
كما يصف لاري ك مع هذا التحرير:
def quid(price)
number_to_currency(price, :unit => "£")
end