LoginSignup
3
3

More than 5 years have passed since last update.

Railsアンチパターン<コントローラー編>③Cookieにいろいろ入れすぎ問題

Last updated at Posted at 2015-06-23

cookieにオブジェクトデータを入れまくるのはやめようという話。例としてはamazonのカートに入れた商品データを全部cookieにそのまま突っ込むというのが揚げられている。
Railsで扱えるcookieの容量は4kb。なんだけど普通こんなに使うことはないので、容量オーバーでバグったらそもそもの設計から見直そう。

ソリューション:インスタンスの代わりに参照を保持しよう。

例では、たとえばこういうことをしている

# @ 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以外にもいろいろやり方はある。適切な方法を探そう。

3
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3