سؤال

لدي رمز مشابه لـ:

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 => "&pound;")
 end
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top