Cookie overflow dalam aplikasi rel?

106

ActionDispatch :: Cookies :: CookieOverflow di UsersController # create

Saya mengalami kesalahan ini saat mencoba membuka halaman. Saya tidak tahu cara men-debug kesalahan ini. Apakah Anda punya saran untuk masalah ini?

def create
  @user = User.new(params[:user])
  sign_in @user

  if @user.save
    @user.folders.create(:folder_name=>"Default Folder", :user_id=>@user.id)
    flash[:success] = "Welcome to Bunch<it>! "
    redirect_to @user
  else
    @title = "Sign up"
    render 'new'
  end
end


def sign_in(user)
  cookies.permanent.signed[:remember_token] = [user.id, user.salt]
  session[:current_user] = user
  current_user = user
end
erogol
sumber
1
kesalahan ini muncul ketika Anda memiliki data / objek besar dalam sesi. Bisakah Anda membagikan kode untuk membuat tindakan di pengontrol?
Naren Sisodiya
3
Sementara jawaban tentang mengubah penyimpanan sesi Anda benar, saya mempertanyakan mengapa Anda ingin menyimpan seluruh pengguna dalam sesi tersebut. Jika Anda harus menyimpan sesuatu, simpan user_id (meskipun itu sudah ada di cookie Anda)
Frederick Cheung
Cukup buka penyimpanan cache browser, dan hapus cookie milik url situs web tertentu. bagi saya itu kebanyakan terjadi di localhost.
ben
Saya telah membuat model pengguna dengan Devisedan saya belum memulai ulang server pengembangan saya setelah menjalankan migrasi. Setelah saya melakukannya, kesalahan berhenti.
wuliwong

Jawaban:

159

Anda memiliki batas 4kb tentang apa yang dapat Anda simpan dalam cookie, dan ketika Rails mengubah objek Anda menjadi teks untuk ditulis ke cookie, itu mungkin lebih besar dari batas itu.

ActionDispatch::Cookies::CookieOverflowKesalahan Ruby on Rails

Dengan cara itu, CookieOverflowKesalahan ini terjadi.

Cara termudah untuk mengatasinya adalah, Anda perlu mengubah session_store Anda dan tidak menggunakan cookie_store. Anda dapat menggunakan active_record_storedengan contoh.

Berikut langkah-langkahnya

  1. Hasilkan migrasi yang membuat tabel sesi

    rake db:sessions:create
  2. Jalankan migrasi

    rake db:migrate
  3. Ubah config/initializers/session_store.rbdari

    (App)::Application.config.session_store :cookie_store, :key => 'xxx'

    untuk

    (App)::Application.config.session_store :active_record_store

Setelah Anda menyelesaikan tiga langkah tersebut, mulai ulang aplikasi Anda. Rails sekarang akan menggunakan tabel sesi untuk menyimpan data sesi, dan Anda tidak akan memiliki batas 4kb.

AMIC MING
sumber
1
apakah mungkin untuk melihat cookie itu untuk memeriksa ini
erogol
hanya ingin tahu - apakah ini batas 4kb per sesi, atau per aplikasi?
colllin
1
@colllin, ini per sesi.
Alex D
apakah saya membutuhkan active_record_storepermata itu?
Saad Masood
atau itu bagian dari rails4
Saad Masood
78

Agar :active_record_storefungsionalitas berfungsi di Rails 4/5, Anda harus menambahkan permata activerecord-session_store ke Gemfile:

gem 'activerecord-session_store'

lalu jalankan generator migrasi:

rails generate active_record:session_migration
rake db:migrate

Dan terakhir, setel penyimpanan sesi Anda di config/initializers/session_store.rb:

Rails.application.config.session_store :active_record_store, :key => '_my_app_session'

MEMPERBARUI:

Jika ada yang menerima null value in column "session_id" violates not-null constraintpesan di rel 4, ada solusi di github (belum diuji). Anda harus membuat penginisialisasi denganActiveRecord::SessionStore::Session.attr_accessible :data, :session_id

Alter Lagos
sumber
Apakah Anda tidak mendapatkan kesalahan saat menggunakan permata ini? Saya mendapatkan yang berikut:ERROR: null value in column "session_id" violates not-null constraint
Peter
@Peter Itu tidak terjadi pada saya, tetapi di sini masih muncul sebagai masalah terbuka. Satu-satunya saran saya adalah menulis komentar dalam masalah itu untuk menontonnya sampai seseorang memperbaikinya. Maaf: /
Alter Lagos
@Peter Saya tidak yakin apakah sudah terlambat, tapi bagaimanapun juga periksa jawaban saya yang diperbarui
Alter Lagos
2
Setelah menjalankan "rails generate active_record: session_migration" jangan lupa untuk menjalankan: "rake db: migrate"!
Patrice Gagnon
2
bagaimana jika saya tidak ingin menyimpan apa pun di DB, bagaimana saya bisa menyelamatkan kesalahan? Saya mencoba rescue_from ActionDispatch :: Cookies :: CookieOverflow,: with =>: render_404 di ApplicationController tetapi tidak berhasil
nisevi
14

Jika Anda melihat ini, periksa bahwa Anda tidak meledakkan beberapa data sesi. Dalam kasus saya, ribuan pesan yang sama dipompa ke dalam pesan flash. Hanya mengatakan.

Saya akan menambahkan bahwa jika menurut Anda solusinya adalah membuat penyimpanan cookie Anda lebih besar (karena sebagian besar alamat jawaban lainnya), Anda mungkin lebih baik memikirkan kembali apa yang sebenarnya Anda masukkan ke dalam cookie. Jika Anda memerlukan lebih dari beberapa token autentikasi, ID sesi, dan mungkin beberapa cookie tata letak / pelacakan, Anda hidup di tahun 90-an.

David Hempy
sumber
1
Saya sangat menggabungkan beberapa parameter untuk menyelamatkan negara!
Anwar
2
Ini juga penyebab kesalahan bagi saya. Menempatkan terlalu banyak data ke dalam pesan flash.
knubie
10

Bukan ide yang baik untuk menyimpan objek model dalam sesi ini.

Lihat siaran kereta api ini tentang topik ini: http://railscasts.com/episodes/13-dangers-of-model-in-session?autoplay=true

Ini praktik yang lebih baik untuk menyimpan id (id pengguna dalam kasus ini) di dalam sesi. Maka Anda tidak akan mengalami masalah ini.

(Lihat juga komentar Frederick Cheung di atas).

Zack Xu
sumber
9

pesan kesalahan dengan jelas menunjukkan masalah dengan ukuran penyimpanan cookie yang meluap.

Sesi Anda (secara default dalam cookie) perlu dipindahkan ke penyimpanan rekaman aktif atau penyimpanan memcache untuk memperbaiki masalah ini.

Untuk sesi Berbasis Data:

config.action_controller.session_store = :active_record_store

Anda perlu membuat tabel sesi seperti di bawah ini

rake db:sessions:create
rake db:migrate

ATAU

Untuk sesi Memcache:

config.action_controller.session_store = :mem_cache_store

Anda juga perlu mengatur server cache mem dan mengkonfigurasinya seperti di bawah ini:

config.cache_store = :mem_cache_store, 'localhost', '127.0.0.1:11211',
{:namespace => 'myapp123'}
Tuhanku
sumber
6

Kesalahan itu karena Anda mencoba untuk membuat serial model pengguna Saat menyimpan objek dalam cookie, rails akan menggunakan Marshal.dump yang dapat menghasilkan konten dalam jumlah besar karena semuanya ada di catatan pengguna

Alih-alih menyimpan catatan pengguna sebenarnya dengan session[:current_user] = usermencoba hanya menyimpan ID pengguna kemudian memiliki metode metode untuk mencari pengguna dari itu misalnya

def sign_in(user)
  ...
  session[:current_user_id] = user.id
end

def current_user
  @current_user ||= User.find(session[:current_user_id])
end
cianmce
sumber
1

Kesalahan ini muncul untuk saya ketika saya menjalankan spesifikasi. Setelah memperbarui Kapibara dari 1.x ke 2.x. Hanya menyapu tmp: jelas diselesaikan.

Artur79
sumber