2012-03-12 3 views
4

Я обновляю кодовую базу от 1,8 до 1,9. Я встречаю пару мест в моем коде (только спецификации, не уверен, что это совпадение), где есть проблемы с блоками, у которых нет переменной. Предоставление им фиктивной переменной устраняет проблему. Вот пример:Ruby 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 

Что здесь происходит?

+2

Лямбда, проки, и блокирует все ведут себя по-разному в Ruby, так что будьте уверены, чтобы указать правильный и не перепутать их. Я считаю, что вы имеете в виду здесь * blocks *, а не Procs/lambdas. –

+0

whoops - да, я знал это, просто читал что-то еще о лямбдах и имел это на мозге: D исправлено сейчас –

+1

, это должно иметь какое-то отношение к Factorygirl. Например, это очень хорошо работает с моей рубиновой версией 1.9.2 irb: 5.times {puts rand (20)} – kclair

ответ

2

В последних версиях factory_girl, определяющих атрибут без аргумента блока, используется экземпляр instance_eval, и предполагается, что вызовы с открытым методом ищут определения предыдущих атрибутов, методы вашей модели или методы синтаксиса, такие как «создать» или «построить». "

Для правильной работы атрибутов, таких как «open» или «file», прокси-объект не определяет большинство частных методов, включая «rand». Это означает, что вам нужно использовать «Kernel.rand» вместо «rand».

Вы можете увидеть соответствующий источник здесь: https://github.com/thoughtbot/factory_girl/blob/master/lib/factory_girl/evaluator.rb#L16

Смежные вопросы