2009-09-09 15 views
9

tôi có mã tương tự như:khô Lần trong Rails (number_to_currency)

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

xả rác quan điểm của tôi trong các mô hình khác nhau. Vì đơn đăng ký của tôi chỉ tính bằng GBP (£), tôi không nên chuyển số này vào từng mô hình của mình sao cho line_item.price trả về chuỗi như trước (ví dụ: number_to_currency(line_item.price, :unit => "£")line_item.price giống nhau. Tôi nghĩ rằng để làm điều này tôi nên :.

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

nhưng điều này không làm việc Nếu price đã được xác định trong mô hình, sau đó Rails 'mức ngăn xếp quá sâu' báo cáo, khi tôi thay đổi def price-def amount, sau đó nó than phiền rằng number_to_currency không được định nghĩa?

+1

Không phải là nó khô hơn nếu bạn chỉ có thể thiết lập các đơn vị mặc định để GBP và sử dụng number_to_currency trực tiếp? –

Trả lời

12

number_to_currency là trình trợ giúp chế độ xem, vì vậy nó không có sẵn trong các kiểu máy

Bạn có thể lưu một số nét chính bằng cách xác định trình trợ giúp của riêng bạn trong application_helper.rb (vì vậy nó có sẵn cho tất cả các dạng xem). Ví dụ:

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

Sau đó gọi nó là trong quan điểm:

quid(line_item.price) 
6

Lý do cho sự chồng mức quá sâu lỗi là khi bạn nói self.price trong phương pháp price bạn đang tạo một cuộc gọi đệ quy vô hạn để phương pháp giá của bạn như bây giờ bạn đã ghi đè phương thức truy cập bình thường. Để tránh điều này, bạn sẽ cần phải truy cập vào giá trị của trường giá bằng cách sử dụng băm thuộc tính. ví dụ. cái gì đó như:

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

trừ một thực tế rằng number_to_currency không có sẵn trong mã mô hình với lý do Larry K mô tả.

+0

Cảm ơn bạn đã giải thích bit gọi đệ quy cho tôi. – Gav

1

Câu trả lời khác về làm một phương pháp helper quid (giá) để đơn giản hóa sự lặp lại có lẽ là phương pháp tốt nhất .. tuy nhiên .. nếu bạn thực sự muốn truy cập vào xem giúp việc trong mô hình bạn có thể làm một cái gì đó như:

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

sau đó bạn sẽ có thể làm điều này trong các lớp mô hình:

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

Dưới đây là cách tiếp cận của tôi cho vấn đề này ..

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

trong các mô hình của bạn, bạn có thể làm điều này (và bạn sẽ không được gây ô nhiễm mô hình của bạn với các phương pháp bạn sẽ không sử dụng)

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

    def price 
    currency_to_number(amount) 
    end 
end 

sau đó cho quan điểm của bạn để tất cả được cập nhật bao gồm các mô-đun trong một của những người giúp đỡ ứng dụng của bạn

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

Bây giờ ở khắp mọi nơi bạn sử dụng số để helper tệ nó sẽ được định dạng với một biểu tượng bảng anh, nhưng bạn cũng có tất cả các flexiblity của phương pháp đường ray gốc, do đó bạn có thể vượt qua trong các tùy chọn như bạn đã làm trước đó ..

number_to_currency(amount, :unit => '$') 

sẽ chuyển đổi lại thành ký hiệu đô la.

41

Nếu bạn muốn thay đổi mặc định cho toàn bộ ứng dụng của bạn, bạn có thể chỉnh sửa config/miền địa phương/en.yml

Mine trông như thế này:

# 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: "&pound;" 
      # These three are to override number.format and are optional 
      separator: "." 
      delimiter: "," 
      precision: 2 

Tất cả mọi thứ ngoại trừ bộ phận là không bắt buộc và sẽ rơi trở lại mặc định, nhưng tôi đặt nó vào để tôi biết những giá trị tôi có thể thay đổi. bạn cũng có thể sử dụng ký hiệu £ thay vì & pound ;.

+0

Cảm ơn mẹo; tài liệu API Rails cho 'ActionView :: Helpers :: NumberHelper number_to_currency()' đưa ra một ví dụ trong đó thiết lập ': locale =>" fr "' thay đổi dấu phân cách và dấu phân cách và vị trí ký hiệu tiền tệ. Điều này không làm việc cho tôi, nhưng bằng cách thêm một 'config/locales/fr.yml' với các thiết lập như trên, nó bắt đầu hoạt động. – bjnord

+2

Tôi đã luôn luôn sử dụng một trình trợ giúp tùy chỉnh, tương tự như cách câu trả lời được chấp nhận của Larry K mô tả, nhưng điều này là sạch hơn rất nhiều. –

1

Tính đến Rails 3

Như Larry K mô tả nhưng với chỉnh sửa này:

def quid(price) 
    number_to_currency(price, :unit => "&pound;") 
end 
Các vấn đề liên quan