Sử dụng gem RubyMoney(Money-Rails) trong ứng dụng rails
Bài đăng này đã không được cập nhật trong 6 năm
Trong quá trình xây dựng một trang eCommerce thì việc lựa chọn xậy dựng đơn vị tiền tệ là một rào cản, với sự hỗ trợ của thư viện gem money-rails làm cho sự lựa chọn đó trở nên dẽ dàng hơn với rất nhiều tiện ích thuận tiện.
Cài đặt gem
- Thêm vào Gemfile
gem "money-rails"
# nhớ chạy lệnh *bundle*
hoặc
gem install money-rails
- Bạn có thể cài đặt môi trường khởi tạo đầu tiên bằng lệnh:
rails g money_rails:initializer
# sẽ sinh ra file config/initializers/money.rb
MoneyRails.configure do |config|
config.default_currency = :usd
config.add_rate "USD", "CAD", 1.24515
config.add_rate "USD", "VND", 22727
end
- Khởi tạo giá trị mặc định của tiền tệ:
Thêm dòng:
# config/initializers/money.rb
config.default_currency = :usd
Tạo mẫu data test
- Ta xây dựng một migrate data với model Product:
class CreateCategories < ActiveRecord::Migration[5.1]
def change
create_table :products do |t|
t.string :name
t.monetize :price
t.string :description
t.timestamps
end
end
end
#app/model/product.rb
class Product < ApplicationRecord
monetize :price_cents, :allow_nil => true
end
- Lúc này giá trị attribute của một đối tượng product:
irb(main):031:0> Product.new
=> #<Product id: nil, name: nil, price_cents: 0, price_currency: "USD", description: nil, created_at: nil, updated_at: nil>
- Ta thử tạo một đối tượng product:
product=Product.new(name:"Laptop")
product.price = Money.new(100, "USD")
product.save
irb(main):006:0> product
=> #<Product id: 1, name: "Laptop", price_cents: 100, price_currency: "USD", description: nil, created_at: "2018-02-02 04:46:46", updated_at: "2018-02-02 04:46:46">
irb(main):007:0> product.price
=> #<Money fractional:100 currency:USD>
#Giá trị của price lúc này có type là Money
Các giá trị Configuration
- Một số tham số để custom giá trị mặt định:
# config/initializers/money.rb
- default_currency: Giá trị đơn vị tiền tệ (mặc định là USD) #config.default_currency = :usd
- add_rate: Cung cấp tỉ giá hối đoái cho các loại tiền tệ # config.add_rate "USD", "CAD", 1.24515
- default_bank: Giá trị mặc định tỉ giá
- default_format: Tùy chọn định dạng
Một số helper hỗ trợ
#price = product.price
#=> #<Money fractional:850 currency:USD>
currency_symbol # <span class="currency_symbol">$</span>
humanized_money price # => 8.50
humanized_money_with_symbol price #=> $8.50
money_without_cents_and_with_symbol price #=> $8
money_without_cents price #=> 8
Một số ví dụ về sự tiện ích khi sử dụng money-rails
# Phép toán
irb(main):011:0> Money.new(800, "USD") + Money.new(200, "USD")
=> #<Money fractional:1000 currency:USD>
irb(main):012:0> Money.new(800, "USD") - Money.new(200, "USD")
=> #<Money fractional:600 currency:USD>
irb(main):013:0> Money.new(800, "USD") / 2
=> #<Money fractional:400 currency:USD>
irb(main):014:0> Money.new(800, "USD") * 2
=> #<Money fractional:1600 currency:USD>
# Chuyển đổi tiền tệ
irb(main):001:0> Money.new(1000, "USD").exchange_to("CAD") # config.add_rate "USD", "CAD", 1.24515
=> #<Money fractional:1245 currency:CAD
irb(main):002:0> Money.new(9800, "USD").exchange_to("VND") #config.add_rate "USD", "VND", 22727
=> #<Money fractional:2227246 currency:VND>
# Chuyển đổi định dạng format
irb(main):003:0> Money.new(2300, "USD").format
=> "$23.00"
irb(main):005:0> Money.new(200, "EUR").format
=> "€2.00"
Link tham khảo: https://rubygems.org/gems/money-rails/versions/1.10.0
All rights reserved