Rails Money Gem и строитель формы - PullRequest
       16

Rails Money Gem и строитель формы

9 голосов
/ 01 февраля 2011

У меня проблема с формами и денежным камнем .

Это моя проблема:

  1. Я создаю запись, которая имеет поле «сумма» (сопоставленное с денежным объектом).Допустим, я ввел 10 (долларов).
  2. Жемчужина денег преобразует его в 1000 (центов)
  3. Я редактирую ту же запись, и в форме предварительно заполняется поле суммы как 1000
  4. Если я сохраню запись, ничего не меняя, она преобразует 1000 (долларов) в 100000 (центов)

Как настроить отображение предварительно заполненной суммы в долларах вместо центов?

Редактировать:

Я пытался редактировать _form.html следующим образом:

= f.text_field(:amount, :to_money)

, и я получаю эту ошибку:

undefined method `merge' for :to_money:Symbol

Ответы [ 4 ]

11 голосов
/ 01 февраля 2011

Учитывая миграцию следующим образом:

class CreateItems < ActiveRecord::Migration
  def self.up
    create_table :items do |t|
      t.integer :cents
      t.string :currency
      t.timestamps
    end
  end

  def self.down
    drop_table :items
  end
end

И модель выглядит следующим образом:

class Item < ActiveRecord::Base
  composed_of :amount,
    :class_name  => "Money",
    :mapping     => [%w(cents 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 conver #{value.class} to Money") }
end

Тогда этот код формы должен работать идеально (я только что протестировал под Rails 3.0.3), правильно отображая и сохраняя сумму в долларах каждый раз, когда вы сохраняете / редактируете. (Это использует стандартные методы обновления / создания скаффолда).

<%= form_for(@item) do |f| %>
  <div class="field">
    <%= f.label :amount %><br />
    <%= f.text_field :amount %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>
3 голосов
/ 15 декабря 2015

Теперь вы можете редактировать монетизированные поля напрямую (money-rails 1.3.0):

# add migration
add_column :products, :price, :price_cents

# set monetize for this field inside the model
class Product
  monetize :price_cents
end

# inside form use .price instead of .price_cents method
f.text_field :price

См. https://stackoverflow.com/a/30763084/46039

3 голосов
/ 16 апреля 2011

Если у вас в таблице несколько полей для денег и вы не можете назвать их все "центами".

class CreateItems < ActiveRecord::Migration
  def self.up
    create_table :items do |t|
      t.integer :purchase_price_cents
      t.string :currency
      t.timestamps
    end
  end

  def self.down
    drop_table :items
  end
end

, что изменит вашу модель на

class Item < ActiveRecord::Base

  composed_of :purchase_price,
    :class_name  => "Money",
    :mapping     => [%w(purchase_price_cents cents), %w(currency currency_as_string)],
    :constructor => Proc.new { |purchase_price_cents, currency| Money.new(purchase_price_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") }

end
0 голосов
/ 16 января 2019

монетизация и простая форма, выполняются следующие шаги:

  1. Миграция

add_monetize: таблица,: сумма

  1. Модель с проверкой

монетизация: количество_центов, allow_nil: истина, числовое значение: {больше_отлично: 0}

  1. Параметры разрешения контроллера (не используйте здесь количество_центов)

params.require (: модель) .permit (: сумма)

  1. простой ввод формы

при сохранении он будет сохранен в центах в столбце сумма_центов в дБ

...