Это происходит потому, что код внутри блока выполняется в контексте объекта Prawn :: Document.Давайте проникнем внутрь этого кода:
module Prawn
class Document
def self.generate(filename,options={},&block)
pdf = new(options,&block)
pdf.render_file(filename)
end
def initialize(options={},&block)
if block
block.arity < 1 ? instance_eval(&block) : block[self]
end
end
end
end
Как видите, block
выполняется с Document
объектом как self
.Он пытается найти @model в качестве переменной экземпляра self
, не может этого сделать и возвращает nil
.Если вы используете локальную переменную model
, вы получите помощь замыканий, и ваш код работает правильно