web-dev-qa-db-fra.com

Débordement de cookie 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 une suggestion 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<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
96
erogol

Vous avez une limite de 4 Ko sur ce que vous pouvez stocker dans un cookie. Lorsque Rails convertit votre objet en texte pour l'écriture dans le cookie, sa limite est probablement supérieure à cette limite.

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

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

Le moyen le plus simple de résoudre ce problème est de changer votre session_store et de ne pas utiliser le cookie_store. Vous pouvez utiliser le 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. Lancer la migration

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

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

    à

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

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

149
AMIC MING

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

gem 'activerecord-session_store'

puis exécutez 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 un message null value in column "session_id" violates not-null constraint dans Rails 4, il existe une solution de contournement dans github } _ (non testée). Vous devez créer un initialiseur avec ActiveRecord::SessionStore::Session.attr_accessible :data, :session_id

70
Alter Lagos

Ce n'est pas une bonne idée de stocker un objet 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'identifiant (l'identifiant de l'utilisateur dans ce cas) à l'intérieur de la session . Dans ce cas, vous n'aurez pas ce problème.

(Voir le commentaire de Frederick Cheung ci-dessus également).

9
Zack Xu

le message d'erreur indique clairement le problème de dépassement de capacité de la banque de cookies.

Vos sessions (par défaut dans les cookies) doivent être déplacées vers Active recordstore ou memcache store pour résoudre ce problème.

Pour les sessions basées sur les données:

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

OR

Pour les sessions Memcache:

config.action_controller.session_store = :mem_cache_store

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

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

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

7
David Hempy

Cette erreur est apparue pour moi lorsque j'exécutais des spécifications Après avoir mis à jour Capybara de 1.x à 2.x ..__, il suffit de rake tmp: clear l’a résolu.

1
Artur79

Cette erreur est due au fait que vous essayez de sérialiser le modèle utilisateur Lors du stockage d'un objet dans un cookie, Rails utilisera Marshal.dump , qui peut générer une grande quantité de contenu, car tout se trouve dans l'enregistrement utilisateur.

Au lieu de stocker l'enregistrement utilisateur réel avec session[:current_user] = user, essayez simplement de stocker l'ID des utilisateurs puis utilisez une méthode pour rechercher l'utilisateur à partir de cet identifiant

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

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