没有变量的Ruby 1.9块

时间:2012-03-12 22:36:04

标签: ruby factory-bot ruby-1.9

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

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

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

在1.9以下,rand(10)会返回nil。很奇怪。我正在绞尽脑汁为什么环境会在街区内变得不同。问题是,rand甚至不是来自标准库 - 它来自核心语言!所以环境并没有真正改变的方式。

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

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

这里发生了什么?

1 个答案:

答案 0 :(得分:2)

在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