Ruby on Rails Money gem: создавайте деньги из формы - PullRequest
1 голос
/ 05 февраля 2012

Я довольно новичок в Rails, и впервые использую деньги. Я вставил следующий код в свою модель, как указано в вики money gem:

composed_of :cash,
:class_name => "Money",
:mapping => [%w(amount cents), %w(currency currency_as_string)],
:constructor => Proc.new { |cents, currency| Money.new(cents || 0, currency ||     Money.default_currency) },
:converter => Proc.new { |value| value.respond_to?(:to_money) ? value.to_money :     raise(ArgumentError, "Can't convert #{value.class} to Money") }

В моей базе данных есть два поля: сумма (целое число) и валюта (строка)

У меня также есть форма, где пользователи могут ввести определенную сумму наличных:

<%= f.number_field :amount %>

Проблема здесь в том, что пользователи заполняют свою сумму как 1,50 вместо 150 центов. Как лучше всего преобразовать пользовательский ввод из 1,50 в 150, прежде чем вставить его в базу данных?

С уважением, Gerwin

Ответы [ 2 ]

0 голосов
/ 01 марта 2012

Доступны несколько вариантов.

Во всех случаях вам необходимо знать, в какой валюте вводится значение в , если , то оно вводится в формате, отличном отвалюта по умолчанию, определенная в Money.default_currency.

1) Использовать новый метод доступа compined_of #cash.

<%= f.number_field :cash %>

примечание: метод f.number_field создает счетчик чисел, а не текстовое поле.

2) Перегрузить определение #amount.Обратите внимание, что я думаю, что этот метод сводит на нет необходимость в макросе mixed_of.

def amount
  cents = read_attribute(:amount) || 0
  currency = read_attribute(:currency_as_string) || Money.default_currency
  Money.new(cents, currency)
end

def amount=(value)
  cash = Money.from_string(value)
  write_attribute(:amount, cash.cents)
end

Посмотрите на методы класса Money.from_ * в документации , в частности, посмотритеa метод Money.from_string [ссылка] .

0 голосов
/ 05 февраля 2012

Заменить запятую на точку, разобрать как float и умножить на 100.

("1,50".gsub(',', '.').to_f * 100).to_i
# => 150
...