【问题标题】:ERROR: nil can't be coerced into Fixnum错误:nil 不能被强制转换为 Fixnum
【发布时间】:2014-06-05 13:38:20
【问题描述】:

首先,这个问题和我之前的question有点相似,但我觉得不同之处足以让我开始一个新的线程。当我尝试在我的模型上测试验证时,就会出现问题。我有一个用户模型,它必须需要字段:default_price。我的测试如下:

it "should require default packs" do
  User.new(FactoryGirl.build(:user, :default_packs => " ")).should_not be_valid
end

但是,当我运行测试时,我收到以下错误:

 Failure/Error: should_not be_valid
 TypeError:
   nil can't be coerced into Fixnum
 # ./app/models/user.rb:62:in `*'
 # ./app/models/user.rb:62:in `daily_saving_potential_cents'
 # ./spec/models/user_spec.rb:155:in `block (2 levels) in <top (required)>'

daily_saving_potential_cents 定义如下:

  def daily_saving_potential_cents
    return default_price_cents * default_packs
  end

default_price_cents 只是 default_price 的一个 monteized 版本,而 default_packs 是我模型中的另一个字段。问题源于这样一个事实,当 default_price_cents 为空白时,这两个不能相乘,但是如何在我的测试中解决这个问题?由于我的验证,default_price_cents 永远不应为空,但如果我正在针对它进行测试。

【问题讨论】:

    标签: ruby-on-rails model fixnum


    【解决方案1】:

    从您的代码中,您将用户对象参数传递给 User.new。我认为你应该使用

    User.new(FactoryGirl.attributes_for(:user, :default_packs => " "))
    

    请试一试。

    【讨论】:

      【解决方案2】:

      这个问题的原因是整数与 nil 的任何算术运算,例如。

      1 + nil
      1 * nil
      等等。

      你可以通过只检查第二个参数是否为 nil 来处理它。

      【讨论】:

        【解决方案3】:

        我通过简单地确保对新模型定义的验证也解决了这个问题,使用:

          def daily_saving_potential_cents
            unless default_price_cents.nil? && default_packs.nil?
              return default_price_cents * default_packs
            end
          end
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多