Ruby 1.9 блоков без переменных - PullRequest
4 голосов
/ 13 марта 2012

Я обновляю кодовую базу с 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 Ответ

2 голосов
/ 03 мая 2012

В последних версиях 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

...