ruby-on-rails 如何获得全价为金钱宝石

zed5wv10  于 2023-05-30  发布在  Ruby
关注(0)|答案(4)|浏览(143)

我正在使用的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

我觉得好像少了一个专栏什么的。它甚至被认为是美分单独?我不确定,所以我需要你的帮助。
谢谢你抽出时间

dwthyt8l

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。
示例:

@my_money_object = 20.to_money
@my_money_object.format

=>“$20.00”
这确实是正确的解决方案。你明确地说你“只是想得到一个像45.23美元这样的全价的方法。”现在如果你想把这个格式化的字符串放在你的DB中,这取决于你,但我会考虑在需要的地方调用money对象的format方法。我需要在一个控制器中获得格式化的价格,显然我没有访问humanize_money方法,除非我在一个视图中(没有试图破解一个额外的方法来做这件事),所以我检查了源代码,发现了这个。

l7mqbcuq

l7mqbcuq2#

好吧
在DB表中,您将美分保存为整数:

t.integer :cents, :default => 0

尝试将其更改为:

t.decimal :cents, :default => 0
oxf4rvwz

oxf4rvwz3#

我下载了gem并测试了几个选项。按照https://github.com/RubyMoney/money中的示例,您可以执行以下操作:

money = Money.new(1000, "USD")
money.cents     #=> 1000
money.dollars   #=> 10.0

所以在我看来,你应该有这样的方法在你的模型价格:

def value
  cents / 100.0
end

并在视图中使用它(或者在任何需要货币价值的地方,而不是美分)。当添加一个价格时,你是用美分来做的,因此要有一个价格12.34,你应该把它设置为1234美分。如果你想添加像12.34这样的price,我想你应该在控制器中解析它(在创建/更新操作中),或者在模型中使用filter before_保存或类似的东西。只需将其乘以100即可将其保存为DB中的美分。
EDIT:添加零到视图的帮助器方法。

def with_zeros(price)
  array = price.to_s.split('.')
  array[1] = array[1].ljust(2,'0')
  array.join('.')
end
3bygqnnd

3bygqnnd4#

好吧,我能弄清楚,谢谢大家!
下面是我的新代码:
数据库现在是:价格而不是:美分-

create_table :prices do |t|
  t.integer :user_id
  t.string :name
  t.date :date
  t.integer :price, :default => 0
  t.string :currency

表单区域:

<div class="field">
    <%= f.label :price %><br />
    <%= f.text_field :price %>
  </div>

新组成:

composed_of :price,
    :class_name  => "Money",
    :mapping     => [%w(price 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") }

我只需要让composed_of匹配Map,数据库列和表单,然后由于一些奇怪的原因,它开始完全工作。感谢大家的帮助,我学到了很多关于Ruby和Rails的知识。

相关问题