没有变量的Ruby 1.9块

我将代码库从1.8升级到1.9.我在我的代码中遇到了几个地方(只有规格,不确定这是不是巧合),哪里有没有变量的块有问题.给他们一个虚拟变量可以解决这个问题.这是一个例子:

在工厂女工厂,这工作在1.8:

Factory.define :thing do |t|
  t.price { 1 - 0.01*rand(10) }
end

在1.9以下,兰特(10)返回零.很奇怪.我正在绞尽脑汁为什么环境会在街区内变得不同.问题是,rand甚至不是来自标准库 – 它来自核心语言!因此,实际上没有一种方法可以改变环境.

然后我记得我的规格中的其他一些地方因为无变量的块而破坏了,所以我一时兴起就扔了一个,并且看到它有效.

Factory.define :thing do |t|
  t.price { |dummy| 1 - 0.01*rand(10) }
end

这里发生了什么?

最佳答案 在factory_girl的最新版本中,定义没有块参数的属性使用instance_eval,并且它假定裸方法调用正在寻找先前的属性定义,模型上的方法或诸如“create”或“build”的语法方法.

为了使“open”或“file”等属性正常工作,代理对象取消定义包括“rand”在内的大多数私有方法.这意味着您需要使用“Kernel.rand”而不仅仅是“rand”.

您可以在此处查看相关来源:https://github.com/thoughtbot/factory_girl/blob/master/lib/factory_girl/evaluator.rb#L16

点赞