2012-04-07 51 views
5

Tôi đang thực hiện giải pháp thương mại bán lẻ đơn giản, trong đó có giá trong một vài kiểu máy khác nhau. Các mức giá này đóng góp cho tổng giá . Hãy tưởng tượng bạn phải trả thêm 0,30 đô la để lựa chọn vị trí đứng đầu cho sữa chua của bạn.Đường ray - Định dạng số dưới dạng định dạng tiền tệ trong Getter

Khi tôi đặt lĩnh vực price để

t.decimal :price, precision:8, scale:2 

Các cửa hàng cơ sở dữ liệu 6.50 như 6.5. Tôi biết theo cách đường ray tiêu chuẩn, bạn gọi number_to_currency(price) để nhận giá trị được định dạng trong Chế độ xem. Tôi cần phải lập trình gọi trường price cũng như chuỗi được định dạng, tức là $ 6,50 một vài địa điểm không trực tiếp là một phần của Chế độ xem. Ngoài ra, nhu cầu của tôi là đơn giản (không có chuyển đổi tiền tệ, vv), tôi muốn có giá được định dạng phổ biến trong mô hình mà không cần gọi lặp đi lặp lại number_to_currency trong chế độ xem.

Có cách nào tốt để tôi có thể sửa đổi giá khởi điểm của mình để giá luôn trả về hai chữ số thập phân với ký hiệu đô la, tức là $ 6,50 khi được gọi?

Xin cảm ơn trước.

CẬP NHẬT

Cảm ơn tất cả mọi người.

Tôi đã chọn sử dụng cách tiếp cận của Alex vì có vẻ như rất 'hack' để thực hiện việc này chỉ để định dạng số. Sử dụng cách tiếp cận của anh ấy, tôi đã làm:

def price_change=(val) 
     write_attribute :price_change, val.to_s.gsub(/[\$]/,'').to_d 
    end 

    def price_change 
    "$%.2f" % self[:price_change] 
    end 

Chúc mừng.

CẬP NHẬT 2

Caveat Emptor. Một khi bạn làm điều này, bạn sẽ mất khả năng thực hiện các thao tác với số đó bởi vì nó bây giờ là một chuỗi.

Hãy cẩn thận nếu có ai gặp phải vấn đề tương tự như tôi.

Trả lời

12

Chỉ cần thêm một phương pháp trong mô hình của bạn được đặt tên như thuộc tính của bạn trong cơ sở dữ liệu như:

def price 
    "$%.2f" % self[:price] 
end 

mang đến cho bạn toàn quyền kiểm soát định dạng hoặc sử dụng phương thức trợ giúp Rails được cung cấp

def price 
    ActionController::Base.helpers.number_to_currency(self[:price]) 
end 

điều này cần thực hiện thủ thuật. hy vọng điều đó sẽ hữu ích!

+1

Xin cảm ơn! Đã được suy nghĩ phải có một số định dạng số được xây dựng trong. Một chút cảnh giác bao gồm ActionView hoặc ActionController vào mô hình. –

+0

Vấn đề với điều này là bạn không thể sử dụng giá như một số, nó là một chuỗi ở khắp mọi nơi. Tôi đang tìm kiếm một cách để làm cho helper đường ray chuyển đổi nó theo cách này trên to_s – Joelio

-1

thử

include ActionView::Helpers::NumberHelper 

để mô hình của bạn

1

Tôi muốn đề xuất sử dụng phương pháp trình bày, như Draper (xem this reailscast).

Một giải pháp khác là triển khai phương pháp của riêng bạn trong mô hình, ví dụ: formatted_price và tự định dạng (ví dụ: với mô-đun ActionView::Helpers::NumberHelper).Nhưng kể từ khi mô hình đại diện cho dữ liệu đơn giản trong ứng dụng đường ray của bạn, đó là kinda râm làm một cái gì đó như thế này và nó can thiệp với quy ước về cách tiếp cận cấu hình, tôi nghĩ.

2

Bạn có thể sử dụng mô-đun trợ giúp, nhưng bạn không nên bao gồm toàn bộ mô-đun, vì nó bao gồm nhiều phương pháp mà bạn có thể không thực sự cần hoặc ghi đè một số của bạn. Nhưng bạn có thể sử dụng chúng trực tiếp:

ActionController::Base.helpers.number_to_currency(6.5) 
#=> "$6.50" 

Bạn cũng có thể xác định phương pháp cho người trợ giúp để bạn có thể dễ dàng sử dụng chúng.

def helpers 
    ActionController::Base.helpers 
end 

"#{helpers.number_to_currency(6.5)}" 

Có một cái nhìn tại railscast

+0

Cảm ơn người đàn ông. Giống như ở trên, một chút cảnh giác về điều này, dường như phá vỡ MVC. Tôi thực sự sẽ thử cả hai =) –

Các vấn đề liên quan