我要将代码库从 1.8 升级到 1.9。我在我的代码中遇到了几个地方(仅规范,不确定这是否是巧合),其中没有变量的 block 存在问题。给他们一个虚拟变量可以解决问题。这是一个例子:
在工厂女孩工厂中,这在 1.8 下有效:
Factory.define :thing do |t|
t.price { 1 - 0.01*rand(10) }
end
在 1.9 下,rand(10)
返回 nil
。很奇怪。我绞尽脑汁想为什么街区内的环境会不一样。问题是,rand
甚至不是来自标准库——它来自核心语言!因此,环境并没有真正发挥作用的方法。
然后我想起我的规范中的其他一些地方因为无变量 block 而被破坏,所以一时兴起我把一个放在那里,你看它起作用了。
Factory.define :thing do |t|
t.price { |dummy| 1 - 0.01*rand(10) }
end
这是怎么回事?
最佳答案
在最新版本的 factory_girl 中,使用 instance_eval 定义一个没有 block 参数的属性,它假定裸方法调用正在寻找以前的属性定义、模型上的方法或语法方法,如“创建”或“构建”。
为了使“open”或“file”等属性正常工作,代理对象取消定义了大多数私有(private)方法,包括“rand”。这意味着您需要使用“Kernel.rand”而不仅仅是“rand”。
您可以在此处查看相关来源:https://github.com/thoughtbot/factory_girl/blob/master/lib/factory_girl/evaluator.rb#L16
关于没有变量的 Ruby 1.9 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9675774/