我正在使用的money gem和我想知道**我如何才能得到价格像23.45,10.00,0.32显示在一个领域作为美元。美分?**我希望我的美分字段变成Price(money或dollars & cents)。
下面是我的代码:
我的模型与金钱宝石组成_of:
class Price < ActiveRecord::Base
attr_accessible :name, :date, :cents, :currency
belongs_to :user
validates :name, :presence => true,
:length => { :maximum => 50 }
validates :currency, :presence => true
validates :cents, :presence => true
validates :date, :presence => true
default_scope :order => 'prices.created_at DESC'
composed_of :price,
: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 convert #{value.class} to Money") }
end
形式(为了简洁,我将部分内容剪掉):
<div class="field">
<%= f.label :name %><br />
<%= f.text_field :name %>
</div>
<div class="field">
<%= f.label :date %><br />
<%= f.date_select :date %>
</div>
<div class="field">
<%= f.label :cents %><br />
<%= f.text_field :cents %>
</div>
<><div class="field">
<%= f.label :currency %><br />
<%= f.select(:currency,major_currencies(Money::Currency::TABLE),
{:include_blank => 'Select a Currency'}) %>
</div>
我的迁移或价目表:
class CreatePrices < ActiveRecord::Migration
def self.up
create_table :prices do |t|
t.integer :user_id
t.string :name
t.date :date
t.integer :cents, :default => 0
t.string :currency
我觉得好像少了一个专栏什么的。它甚至被认为是美分单独?我不确定,所以我需要你的帮助。
谢谢你抽出时间
4条答案
按热度按时间dwthyt8l1#
刚刚遇到了完全相同的问题,如果你不想像在你选择的答案中那样更改你的DB,只需看看gem的源代码,看看是否有什么可以用途:
https://github.com/RubyMoney/money-rails/blob/master/lib/money-rails/helpers/action_view_extension.rb
在本模块中,您将注意到两件事:
1.名为humanize_money的方法
1.在该方法中,对money对象上的方法格式的调用
因此,只需调用**@my_money_object.format**,然后....bam,您就可以将money对象格式化为一个字符串,其中美元和美分的数量精度为2。
示例:
=>“$20.00”
这确实是正确的解决方案。你明确地说你“只是想得到一个像45.23美元这样的全价的方法。”现在如果你想把这个格式化的字符串放在你的DB中,这取决于你,但我会考虑在需要的地方调用money对象的format方法。我需要在一个控制器中获得格式化的价格,显然我没有访问humanize_money方法,除非我在一个视图中(没有试图破解一个额外的方法来做这件事),所以我检查了源代码,发现了这个。
l7mqbcuq2#
好吧
在DB表中,您将美分保存为整数:
尝试将其更改为:
oxf4rvwz3#
我下载了gem并测试了几个选项。按照https://github.com/RubyMoney/money中的示例,您可以执行以下操作:
所以在我看来,你应该有这样的方法在你的模型价格:
并在视图中使用它(或者在任何需要货币价值的地方,而不是美分)。当添加一个价格时,你是用美分来做的,因此要有一个价格12.34,你应该把它设置为1234美分。如果你想添加像12.34这样的price,我想你应该在控制器中解析它(在创建/更新操作中),或者在模型中使用filter before_保存或类似的东西。只需将其乘以100即可将其保存为DB中的美分。
EDIT:添加零到视图的帮助器方法。
3bygqnnd4#
好吧,我能弄清楚,谢谢大家!
下面是我的新代码:
数据库现在是:价格而不是:美分-
表单区域:
新组成:
我只需要让composed_of匹配Map,数据库列和表单,然后由于一些奇怪的原因,它开始完全工作。感谢大家的帮助,我学到了很多关于Ruby和Rails的知识。