cookieにオブジェクトデータを入れまくるのはやめようという話。例としてはamazonのカートに入れた商品データを全部cookieにそのまま突っ込むというのが揚げられている。
Railsで扱えるcookieの容量は4kb。なんだけど普通こんなに使うことはないので、容量オーバーでバグったらそもそもの設計から見直そう。
ソリューション:インスタンスの代わりに参照を保持しよう。
例では、たとえばこういうことをしている
.rb
# @ in controller
def new
session[:order] = Order.new
end
def create
if session[:order].save
#...
end
def billing
session[:order].attributes = params[:order]
#...
end
def shipping
session[:order].attributes = params[:order]
#..
#...
このようにcookieをdata storeとして使うのは本来の使い道ではない。やめよう。
やり方は二つあって、
- Database内のobjectに状態を持たせる(カラムを追加する)
- 毎回resuqestごとに新しくインスタンスを作る(
from.hidden_field
を利用して今までの情報も同時に送る)
後者のクライアント側に情報を持たせる方法はあんまり数多くのステップを踏まないようなフローや、DB内に不完全なレコードを置きたくない場合に適切。複雑なフローの場合には前者を利用すると良いだろう。
結論:状態を管理するのにもcookie以外にもいろいろやり方はある。適切な方法を探そう。