Ray uygulamasında çerez taşması?


106

ActionDispatch :: Cookies :: UsersController'da CookieOverflow # create

Sayfayı açmaya çalıştığımda bu hatayı alıyorum. Bu hatayı nasıl ayıklayacağımı bilmiyorum. Bu sorun için herhangi bir öneriniz var mı?

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

1
bu hata, oturumda büyük bir veriniz / nesneniz olduğunda ortaya çıkar. Controller'da eylem oluşturmak için kodu paylaşabilir misiniz?
Naren Sisodiya


3
Oturum deponuzu değiştirmeyle ilgili cevaplar doğru olsa da, tüm kullanıcıyı neden oturumda depolamak istediğinizi sorardım. Bir şeyi saklamanız gerekiyorsa, user_id'yi saklayın (zaten çerezinizde olmasına rağmen)
Frederick Cheung

Tarayıcı önbellek deposuna gidin ve söz konusu web sitesi url'sine ait çerezleri temizleyin. benim için çoğunlukla localhost'ta oluyor.
ben

İle bir kullanıcı modeli oluşturmuştum Deviseve taşıma işlemlerini çalıştırdıktan sonra geliştirme sunucumu yeniden başlatmamıştım. Bir kez yaptım, hata durdu.
wuliwong

Yanıtlar:


159

Bir çerezde ne saklayabileceğinize dair 4kb sınırınız vardır ve Rails nesnenizi çereze yazmak için metne dönüştürdüğünde bu sınır muhtemelen bu sınırdan daha büyüktür.

Ruby on Rails ActionDispatch::Cookies::CookieOverflowhatası

Bu şekilde bu CookieOverflowHata oluşur.

Bunu çözmenin en kolay yolu, session_store'unuzu değiştirmeniz ve cookie_store. active_record_storeÖrnek olarak kullanabilirsiniz .

İşte adımlar

  1. Oturum tablosunu oluşturan bir geçiş oluşturun

    rake db:sessions:create
  2. Taşıma işlemini çalıştırın

    rake db:migrate
  3. Değiştir config/initializers/session_store.rbdan

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

    -e

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

Üç adımı tamamladıktan sonra uygulamanızı yeniden başlatın. Rails artık oturum verilerini depolamak için oturumlar tablosunu kullanacak ve 4kb sınırına sahip olmayacaksınız.


1
bu çerezi kontrol etmek mümkün mü
erogol

sadece merak ediyorum - bu, oturum başına mı yoksa uygulama başına bir 4kb sınır mı?
colllin

1
@colllin, seans başına.
Alex D

cevhere ihtiyacım var active_record_storemı?
Saad Masood

yoksa rayların bir parçası mı?
Saad Masood

78

Yapmak için :active_record_storeRaylar 4/5 yılında işlevselliği işleri, eklemek gerekir activerecord-session_store adresinden Müşteri mücevher Gemfile:

gem 'activerecord-session_store'

ardından geçiş oluşturucuyu çalıştırın:

rails generate active_record:session_migration
rake db:migrate

Ve son olarak oturum mağazanızı şuraya ayarlayın config/initializers/session_store.rb:

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

GÜNCELLEME:

Herhangi biri null value in column "session_id" violates not-null constraintraylar 4'te bir mesaj alıyorsa , github'da bir geçici çözüm vardır (test edilmemiştir). İle bir başlatıcı oluşturmalısınızActiveRecord::SessionStore::Session.attr_accessible :data, :session_id


Bu mücevheri kullanırken bir hata almadınız mı? Aşağıdakileri alıyorum:ERROR: null value in column "session_id" violates not-null constraint
Peter

@Peter Bu benim olmadı, ama burada hala açık bir sorun olarak görünüyor. Tek tavsiyem, bu sayıya bir yorum yazıp birisi bir düzeltme yapana kadar onu izlemek. Pardon: /
Lagos

@Peter Çok geç olup olmadığından emin değilim, ama yine de güncellenmiş cevabımı kontrol et
Alter Lagos

2
"Rails generate active_record: session_migration" çalıştırdıktan sonra şunu çalıştırmayı unutmayın: "rake db: migrate"!
Patrice Gagnon

2
DB'de hiçbir şey saklamak istemiyorsam, hatayı nasıl kurtarabilirim? ApplicationController'da ActionDispatch :: Cookies :: CookieOverflow'dan rescue_from'u denedim,: with =>: render_404 ama işe yaramadı
nisevi

14

Bunu görüyorsanız, bazı oturum verilerini havaya uçurmadığınızdan emin olun. Benim durumumda, flaş mesaja pompalanan binlerce aynı mesajdı. Sadece söylüyorum.

Çözümün çerez deponuzu büyütmek olduğunu düşünüyorsanız (diğer cevapların çoğunun adresi olduğu gibi), muhtemelen çerezlere ne koyduğunuzu yeniden düşünmeniz daha iyi olacaktır. Birkaç yetkilendirme jetonuna, oturum kimliğine ve belki birkaç düzen / izleme çerezine ihtiyacınız varsa, 90'larda yaşıyorsunuz demektir.


1
Eyaleti kurtarmak için bazı parametreleri derinden birleştiriyordum!
Enver

2
Benim için de hatanın nedeni buydu. Flash mesaja çok fazla veri koymak.
knubie


9

hata mesajı, taşan çerez deposu boyutundaki sorunu açıkça gösterir.

Bu sorunu gidermek için oturumlarınızın (varsayılan olarak tanımlama bilgisinde) Aktif kayıt deposuna veya memcache deposuna taşınması gerekir.

Veritabanına dayalı oturumlar için:

config.action_controller.session_store = :active_record_store

Aşağıdaki gibi oturum tablosu oluşturmanız gerekmektedir

rake db:sessions:create
rake db:migrate

VEYA

Memcache oturumları için:

config.action_controller.session_store = :mem_cache_store

Ayrıca bir mem önbellek sunucusu kurmanız ve aşağıdaki gibi yapılandırmanız gerekir:

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

6

Bu hata, kullanıcı modelini seri hale getirmeye çalıştığınız içindir. Bir nesneyi bir çerezde saklarken, rails , kullanıcı kaydındaki her şey olduğu için büyük miktarda içerik üretebilen Marshal.dump kullanır.

Gerçek kullanıcı kaydını session[:current_user] = usersadece kullanıcıların kimliğini depolamayı deneyin, ardından kullanıcıyı bu örnekten aramak için bir yönteme sahip olun.

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

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

1

Bu hata benim için bir teknik özellik çalıştırırken ortaya çıktı. Capybara'yı 1.x'ten 2.x'e güncelledikten sonra. Sadece rake tmp: net çözdü.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.