没有变量的 Ruby 1.9 block

标签 ruby factory-bot ruby-1.9

我要将代码库从 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/

相关文章:

ruby-on-rails - 在 JSON 中显示的未定义方法错误

ruby - 如何将 ruby​​ 类导入主文件?

ruby - 尝试在 Ruby 中打开文件 - 获取类型错误 : can't convert String into Integer

ruby - 如何用新值替换散列中的所有值?

ruby - 为什么在 Ruby 1.9 中两个具有相同字节和编码的字符串不相同?

ruby-on-rails - 我怎样才能得到从开始日期开始的每 7 天的日期一段时间

ruby-on-rails - FactoryGirl has_many 协会

ruby-on-rails - 如何在工厂中保存局部变量

ruby-on-rails - 如何使用 FactoryGirl 发送参数(而不是手动将参数作为散列发送)?

ruby-on-rails - Ruby、RoR、gmail 和 NET::SMTP