ruby on rails - money - Rails dinero gema y forma constructor
humanized money with symbol rails (3)
Tengo un problema con los formularios y la joya del dinero .
Este es mi problema:
- Creé un registro que tiene un campo de "cantidad" (asignado a un objeto de dinero). Digamos que ingreso 10 (dólares).
- La gema de dinero lo convierte en 1000 (centavos)
- Edito el mismo registro y el formulario completa previamente el campo de cantidad como 1000
- Si guardo el registro sin cambiar nada, convertirá los 1000 (dólares) a 100000 (centavos)
¿Cómo hago que muestre la cantidad pre-poblada en dólares en lugar de centavos?
Editar:
Traté de editar el _form.html de esta manera:
= f.text_field(:amount, :to_money)
y obtengo este error:
undefined method `merge'' for :to_money:Symbol
Ahora puede editar campos monetizados directamente (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
Ver https://.com/a/30763084/46039
Dada una migración de la siguiente manera:
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
Y un modelo de la siguiente manera:
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
Entonces, este código de formulario debería funcionar perfectamente (acabo de probar bajo Rails 3.0.3), mostrando y guardando correctamente la cantidad en dólares cada vez que guarda / edita. (Esto está usando los métodos de actualización / creación de andamios por defecto).
<%= form_for(@item) do |f| %>
<div class="field">
<%= f.label :amount %><br />
<%= f.text_field :amount %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
Si tiene varios campos de dinero en su mesa y no puede nombrarlos a todos "centavos".
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
que cambiaría tu modelo a
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