ブロック内のActiveRecordミューテータにアクセスできない

私はRailsコントローラの中にいて、ブロック内のインスタンス変数にアクセスしようとしています。 これは、
“Nilのメソッドフィールド1はありません”というエラーを出します。

Prawn::Document.generate("hello.pdf") do
  @model.field1
end

しかし、私がこれを行うと、それは動作します:

my_model = @model
Prawn::Document.generate("hello.pdf") do
  my_model.field1
end

これはブロック内のActiveRecordアクセサやインスタンス変数と関係がありますか?

ベストアンサー

この種の問題は、通常は instance_eval
によってブロックが別のコンテキストで実行されているときに表示されます。だからコードをチェックしましょう:

#lib/prawn/document.rb: Document#initialize    
if block
  block.arity < 1 ? instance_eval(&block) : block[self]
end

そこにあなたの instance_eval
があり、ソリューションを見ることもできます:ドキュメントを引数として受け入れるブロックを渡すと、いつものようにインスタンス変数にアクセスできるようになります:

Prawn::Document.generate("hello.pdf") do |doc|
  @my_model.field1
end

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です