たとえば、次のコード:
class FoosController < ApplicationController
def index
if !@foo.nil?
render :locals => {:bar => @foo}
return
else
@foo = rand 10
render :locals => {:bar => @foo}
end
end
end
複数回ロードlocalhost:3000/foos
すると、異なる値が表示されます。これが開発モードであっても、ブラウザー リクエストが来るたびに Rails がコントローラー (およびモデルとビュー) をリロードするため、驚くことではありません。
しかし、本番モードであっても、すべてがロードされてそこにとどまっている場合、@foo
の値はブラウザのリクエスト間で維持されませんか? Web ブラウザでページをリロードするたびに、異なる番号が表示されます。では、Rails は毎回すべての値を消去しますか? DBMS を使用しない場合、リクエスト全体で結果をキャッシュまたは「メモ化」する方法はありますか?
驚いたことに、クラス変数を使用してみましたが、開発モードでは毎回異なる番号が返されます。実稼働モードでは、Firefox の数値は同じままで、サーバーが再起動されるまで、Chrome にも常にその数値が表示されます。
class FoosController < ApplicationController
@@foo = nil
def index
if !@@foo.nil?
render :locals => {:bar => @@foo}
return
else
@@foo = rand 10
render :locals => {:bar => @@foo}
end
end
end
クラス変数はメモ化できるのに、インスタンス変数はメモ化できないのはなぜですか? クラス変数を使用することは、Rails 2.x、3.x、および Ruby 1.8.7 と 1.9.2 で確実にリクエスト全体で「物事を記憶する」ための信頼できる方法ですか?