0

在运行 RSpec 和 FactoryGirl 时,它会自动将任何:id参数转换为 fixnum,而在现实生活中,它会作为字符串传递。代码我有:id作为复合主键尝试调用 split on 的进程params[:id]。这会导致异常,如下所示:

NoMethodError:
    undefined method 'split' for 234:Fixnum

当试图调用这样的东西时:

  @myinstance = MyClass.find(params[:id].split("-").map{|x| x.to_i})

为了解决这个问题,我添加了一个简单的类型检查:

if params[:id].is_a? Fixnum
  @myinstance = MyClass.find(params[:id])
else
  @myinstance = MyClass.find(params[:id].split("-").map{|x| x.to_i})
end

然而,这并不像我期望的那样工作。该if语句的计算结果为false,并且split仍在尝试,导致相同的错误。Ruby 怎么可能params[:id]在 " " 逻辑中识别为 Fixnum ,但在语句中else无法计算到?trueif

4

1 回答 1

3

这是纯粹的逻辑:params[:id]是 a Stringor nil

哦......我必须编辑我的答案:

当你做控制器规格时,你发送的参数是发送的as-is,而不是字符串化的……这很痛苦,但迟早应该修复。

因此,在您的规格中,将您的参数字符串化以更接近现实。

这是非常重要的一点:不要让你的代码适应你的规范,相反。

于 2012-05-21T19:54:41.170 回答