12/08/2018, 17:16

Sử dụng gem RubyMoney(Money-Rails) trong ứng dụng rails

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 ...

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

0