Débordement de cookies dans l’application rails?

ActionDispatch :: Cookies :: CookieOverflow dans UsersController # create

J’ai cette erreur lorsque j’essaie d’ouvrir la page. Je ne sais pas comment déboguer cette erreur. Avez-vous des suggestions pour ce problème?

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! " 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 

Vous avez une limite de 4 Ko sur ce que vous pouvez stocker dans un cookie, et lorsque Rails convertit votre object en texte pour écrire sur le cookie, il est probablement plus grand que cette limite.

Ruby on Rails ActionDispatch::Cookies::CookieOverflow Erreur ActionDispatch::Cookies::CookieOverflow

De cette façon, cette erreur CookieOverflow se produit.

Le moyen le plus simple de résoudre ce problème est de changer votre session_store et de ne pas utiliser cookie_store . Vous pouvez utiliser active_record_store par exemple.

Voici les étapes

  1. Générer une migration qui crée la table de session

     rake db:sessions:create 
  2. Exécuter la migration

     rake db:migrate 
  3. Modifier config/initializers/session_store.rb partir de

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

    à

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

Une fois les trois étapes effectuées, redémarrez votre application. Rails utilisera désormais la table des sessions pour stocker les données de session et vous ne disposerez pas de la limite de 4 Ko.

Pour que la fonctionnalité :active_record_store fonctionne dans Rails 4/5, vous devez append le joyau activerecord-session_store à votre Gemfile :

 gem 'activerecord-session_store' 

puis lancez le générateur de migration:

 rails generate active_record:session_migration rake db:migrate 

Et enfin, définissez votre magasin de session dans config/initializers/session_store.rb :

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

METTRE À JOUR:

Si quelqu’un reçoit une null value in column "session_id" violates not-null constraint message de null value in column "session_id" violates not-null constraint dans les rails 4, il existe une solution de contournement dans github (non testé). Vous devez créer un initialiseur avec ActiveRecord::SessionStore::Session.attr_accessible :data, :session_id

le message d’erreur indique clairement le problème de la taille du magasin de cookies qui est dépassée.

Vos sessions (par défaut dans les cookies) doivent être déplacées dans le magasin de disques Active ou dans le magasin memcache pour résoudre ce problème.

Pour les sessions en firebase database:

 config.action_controller.session_store = :active_record_store 

Vous devez créer la table de session comme ci-dessous

 rake db:sessions:create rake db:migrate 

OU

Pour les sessions Memcache:

 config.action_controller.session_store = :mem_cache_store 

Vous devez également configurer un serveur de cache mem et le configurer comme suit:

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

Ce n’est pas une bonne idée de stocker un object de modèle dans la session.

Découvrez cette diffusion sur ce sujet: http://railscasts.com/episodes/13-dangers-of-model-in-session?autoplay=true

Il est préférable de stocker l’ID (identifiant de l’utilisateur dans ce cas) dans la session. Alors vous n’aurez pas ce problème.

(Voir le commentaire de Frédéric Cheung ci-dessus également).

Si vous voyez ceci, vérifiez que vous ne faites pas exploser certaines données de session. Dans mon cas, ce sont des milliers du même message pompé dans le message flash. Je dis juste

Cette erreur est apparue pour moi quand j’utilisais une spécification. Après la mise à jour de Capybara de 1.x à 2.x. Juste rake tmp: clear résolu.