代码之家  ›  专栏  ›  技术社区  ›  Anders

money rails,money#==只支持零数字

  •  2
  • Anders  · 技术社区  · 6 年前

    money-rails 我的Rails应用程序中的gem。到目前为止,它一直工作得很好,但我最近开始出现以下错误:

    Money#== supports only zero numerics
    

    bundle update 所以我想有些东西已经更新了。我的 gemfile 看起来像这样:

    gem 'money-rails', '~>1'
    gem 'eu_central_bank', "~>1.3.0"
    

    # model
    monetize :price_in_cents
    
    # fetch / converting currencies
    eu_bank = EuCentralBank.new
    Money.default_bank = eu_bank
    eu_bank.update_rates
    converted_price = eu_bank.exchange_with(Money.new(price_to_convert * 100, from_currency), to_currency)
    

    有什么想法吗?

    为了测试,我尝试了以下方法。

    money = Money.new(100, from_currency)
    

    然后我得到了和以前一样的错误。但如果我试过:

    money = Money.new(0, from_currency)
    

    好像有用。我觉得有点奇怪。

    更新

    以下是我尝试保存记录时的回溯:

    [“/Users/[user]/.rvm/gems/ruby-2.5.1/gems/money-6.11.3/lib/money/money/算术。rb:70:英寸 =='", "/Users/[user]/.rvm/gems/ruby-2.5.1/gems/activemodel-5.1.6/lib/active_model/validations/numericality.rb:22:in !='“,”/Users/[user]/.rvm/gems/ruby-2.5.1/gems/activemodel-5.1.6/lib/active\u model/validations/数字。rb:22:英寸 validate_each'", "/Users/[user]/.rvm/gems/ruby-2.5.1/gems/activemodel-5.1.6/lib/active_model/validator.rb:150:in 阻止/Users/[user]/.rvm/gems/ruby-2.5.1/gems/activemodel-5.1.6/lib/active\u model/验证器。rb:147:英寸 each'", "/Users/[user]/.rvm/gems/ruby-2.5.1/gems/activemodel-5.1.6/lib/active_model/validator.rb:147:in 验证“,”/Users/[user]/.rvm/gems/ruby-2.5.1/gems/activesupport-5.1.6/lib/active\u-support/callbacks.rb:413:英寸 block in make_lambda'", "/Users/[user]/.rvm/gems/ruby-2.5.1/gems/activesupport-5.1.6/lib/active_support/callbacks.rb:197:in 停止“,”/Users/[user]/.rvm/gems/ruby-2.5.1/gems/activesupport-5.1.6/lib/active\u-support中的块(2级)/回调。rb:601:英寸 block (2 levels) in default_terminator'", "/Users/[user]/.rvm/gems/ruby-2.5.1/gems/activesupport-5.1.6/lib/active_support/callbacks.rb:600:in block in default_terminator'", "/Users/[user]/.rvm/gems/ruby-2.5.1/gems/activesupport-5.1.6/lib/active_support/callbacks.rb:198:in 阻止暂停“,”/Users/[user]/.rvm/gems/ruby-2.5.1/gems/activesupport-5.1.6/lib/active\u-support/回调。rb:507:英寸 block in invoke_before'", "/Users/[user]/.rvm/gems/ruby-2.5.1/gems/activesupport-5.1.6/lib/active_support/callbacks.rb:507:in 每个“'”/Users/[user]/.rvm/gems/ruby-2.5.1/gems/activesupport-5.1.6/lib/active\u支持/回调。rb:507:英寸 invoke_before'", "/Users/[user]/.rvm/gems/ruby-2.5.1/gems/activesupport-5.1.6/lib/active_support/callbacks.rb:130:in 运行“/Users/[user]/.rvm/gems/ruby-2.5.1/gems/activesupport-5.1.6/lib/active\u support”/回调。rb:827:英寸 _run_validate_callbacks'", "/Users/[user]/.rvm/gems/ruby-2.5.1/gems/activemodel-5.1.6/lib/active_model/validations.rb:405:in block in run_validations!'", "/Users/[user]/.rvm/gems/ruby-2.5.1/gems/activesupport-5.1.6/lib/active_support/callbacks.rb:97:in 运行“/Users/[user]/.rvm/gems/ruby-2.5.1/gems/activesupport-5.1.6/lib/active\u support”/callbacks.rb:827:英寸 _run_validation_callbacks'", "/Users/[user]/.rvm/gems/ruby-2.5.1/gems/activemodel-5.1.6/lib/active_model/validations/callbacks.rb:114:in 运行\u验证!'“,“/Users/[user]/.rvm/gems/ruby-2.5.1/gems/activemodel-5.1.6/lib/active\u model/验证。rb:335:英寸 valid?'", "/Users/[user]/.rvm/gems/ruby-2.5.1/gems/activerecord-5.1.6/lib/active_record/validations.rb:65:in 有效?'“,”/Users/[user]/.rvm/gems/ruby-2.5.1/gems/activerecord-5.1.6/lib/active\u record/validations.rb:82:英寸 perform_validations'", "/Users/[user]/.rvm/gems/ruby-2.5.1/gems/activerecord-5.1.6/lib/active_record/validations.rb:50:in “保存!”“,“/Users/[user]/.rvm/gems/ruby-2.5.1/gems/activerecord-5.1.6/lib/active\u record/attribute\u方法/脏。rb:43:英寸 save!'", "/Users/[user]/.rvm/gems/ruby-2.5.1/gems/activerecord-5.1.6/lib/active_record/transactions.rb:313:in 在save!中阻止“”/用户/[user]/.rvm/gems/ruby-2.5.1/gems/activerecord-5.1.6/lib/active\u-record/transactions.rb:384:英寸 block in with_transaction_returning_status'", "/Users/[user]/.rvm/gems/ruby-2.5.1/gems/activerecord-5.1.6/lib/active_record/connection_adapters/abstract/database_statements.rb:235:in block in within_new_transaction'", "/Users/[user]/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/monitor.rb:226:in mon\u synchronize“,”/Users/[user]/.rvm/gems/ruby-2.5.1/gems/activerecord-5.1.6/lib/active\u record/connection\u adapters/abstract/事务处理。rb:191:英寸 within_new_transaction'", "/Users/[user]/.rvm/gems/ruby-2.5.1/gems/activerecord-5.1.6/lib/active_record/connection_adapters/abstract/database_statements.rb:235:in 事务“,”/Users/[user]/.rvm/gems/ruby-2.5.1/gems/activerecord-5.1.6/lib/active\u record/事务处理。rb:210:英寸 transaction'", "/Users/[user]/.rvm/gems/ruby-2.5.1/gems/activerecord-5.1.6/lib/active_record/transactions.rb:381:in 当“事务”返回“状态”时,“/Users/[user]/.rvm/gems/ruby-2.5.1/gems/activerecord-5.1.6/lib/active\u record/事务处理。rb:313:英寸 save!'", "/Users/[user]/.rvm/gems/ruby-2.5.1/gems/activerecord-5.1.6/lib/active_record/suppressor.rb:46:in 保存!“,”/Users/[user]/Documents/Development/wondery/[appname]/lib/importers/bts\u批发商_importer.rb:245:英寸 block in set_supported_currencys_for_product_variant'", "/Users/[user]/Documents/Development/wondery/[appname]/lib/importers/bts_wholesaler_importer.rb:240:in 每个“,”/Users/[user]/Documents/Development/wondery/[appname]/lib/importers/bts\u批发商_进口商:rb:240:英寸 set_supported_currencys_for_product_variant'", "/Users/[user]/Documents/Development/wondery/[appname]/lib/importers/bts_wholesaler_importer.rb:224:in 设置产品变量“,”/Users/[user]/Documents/Development/wondery/[appname]/lib/importers/bts\u批发商_importer.rb:208:英寸 match_product_variant_to_product'", "/Users/[user]/Documents/Development/wondery/[appname]/lib/importers/bts_wholesaler_importer.rb:84:in 阻止从“/Users/[user]/Documents/Development/wondery/[appname]/lib/importers/bts\u批发商”获取产品_进口商。rb:75:英寸 map'", "/Users/[user]/Documents/Development/wondery/[appname]/lib/importers/bts_wholesaler_importer.rb:75:in import'", "(irb):2:in irb_binding“,”/Users/[user]/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/irb/工作区。rb:85:英寸 eval'", "/Users/[user]/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/irb/workspace.rb:85:in 计算“,”/Users/[user]/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/irb/上下文。rb:380:英寸 evaluate'", "/Users/[user]/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/irb.rb:491:in signal_status'", "/Users/[user]/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/irb.rb:488:in 在eval_input“”中阻塞,“/Users/[user]/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/irb/ruby-法律注册号:246:英寸 block (2 levels) in each_top_level_statement'", "/Users/[user]/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/irb/ruby-lex.rb:232:in 循环“,”/Users/[user]/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/irb/ruby-莱克斯。rb:232:英寸 block in each_top_level_statement'", "/Users/[user]/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/irb/ruby-lex.rb:231:in catch“,”/Users/[user]/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/irb/ruby-法律rb:231:英寸 each_top_level_statement'", "/Users/[user]/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/irb.rb:487:in eval_input“”,“/Users/[user]/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/irb.rb:428:英寸 block in run'", "/Users/[user]/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/irb.rb:427:in catch“,”/Users/[user]/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/内部评级机构:427:英寸 run'", "/Users/[user]/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/irb.rb:383:in 启动“'”/Users/[user]/.rvm/gems/ruby-2.5.1/gems/railties-5.1.6/lib/rails/commands/console/console_命令。rb:62:英寸 start'", "/Users/[user]/.rvm/gems/ruby-2.5.1/gems/railties-5.1.6/lib/rails/commands/console/console_command.rb:17:in perform'", "/Users/[user]/.rvm/gems/ruby-2.5.1/gems/thor-0.20.0/lib/thor/command.rb:27:in 运行“,”/Users/[user]/.rvm/gems/ruby-2.5.1/gems/thor-0.20.0/lib/thor/调用.rb:126:英寸 invoke_command'", "/Users/[user]/.rvm/gems/ruby-2.5.1/gems/thor-0.20.0/lib/thor.rb:387:in perform'", "/Users/[user]/.rvm/gems/ruby-2.5.1/gems/railties-5.1.6/lib/rails/command.rb:44:in 调用“'”/Users/[user]/.rvm/gems/ruby-2.5.1/gems/railties-5.1.6/lib/rails/命令。rb:16:英寸 <top (required)>'", "/Users/[user]/.rvm/gems/ruby-2.5.1/gems/activesupport-5.1.6/lib/active_support/dependencies.rb:292:in 需要“'”/Users/[user]/.rvm/gems/ruby-2.5.1/gems/activesupport-5.1.6/lib/active\u支持/依赖关系。rb:292:英寸 block in require'", "/Users/[user]/.rvm/gems/ruby-2.5.1/gems/activesupport-5.1.6/lib/active_support/dependencies.rb:258:in require'", "/Users/[user]/Documents/Development/wondery/[appname]/bin/rails:9:in “,”/Users/[user]/.rvm/gems/ruby-2.5.1/gems/activesupport-5.1.6/lib/active\u支持/依赖关系。rb:286:英寸 load'", "/Users/[user]/.rvm/gems/ruby-2.5.1/gems/activesupport-5.1.6/lib/active_support/dependencies.rb:286:in 在load“'”/Users/[user]/.rvm/gems/ruby-2.5.1/gems/activesupport-5.1.6/lib/active\u-support中阻塞/依赖关系。rb:258:英寸 load_dependency'", "/Users/[user]/.rvm/gems/ruby-2.5.1/gems/activesupport-5.1.6/lib/active_support/dependencies.rb:286:in require'", "/Users/[user]/.rvm/rubies/ruby-2.5.1/lib/ruby/site_ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in require'“,”-e:1:in`'“]

    2 回复  |  直到 6 年前
        1
  •  7
  •   trueunlessfalse    6 年前

    错误来自模型的数值验证。

    货币宝石不允许将货币对象与数字进行比较,除非数字为零。否则它期望你把钱和钱做比较。

    在irb中,您可以尝试:

    2.5.1 :006 > Money.new(1000, "USD") != Money.new(1000, "USD")
     => false 
    
    2.5.1 :007 > Money.new(1000, "USD") != 1000
    Traceback (most recent call last):
            4: from /Users/andi/.rvm/rubies/ruby-2.5.1/bin/irb:11:in `<main>'
            3: from (irb):7
            2: from (irb):7:in `!='
            1: from /Users/andi/.rvm/gems/ruby-2.5.1/gems/money-6.12.0/lib/money/money/arithmetic.rb:70:in `=='
    ArgumentError (Money#== supports only zero numerics)
    
    2.5.1 :008 > Money.new(1000, "USD") != 0
     => true 
    

    ```

    我相信这个错误是有道理的,因为你不能真的把一个任意的数字和一个给定货币的货币数量进行比较。

    money rails gem也有自己的验证器:

    https://github.com/RubyMoney/money-rails#numericality-validation-options

        2
  •  2
  •   Andrew    6 年前

    在编写规范时也可能遇到此错误:

    expect(order.subtotal).to eq 123.45
    # ArgumentError:
    #   Money#== supports only zero numerics
    
    expect(order.subtotal).to eq Money.new(12345)
    # works!