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
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
Générer une migration qui crée la table de session
rake db:sessions:create
Lancer la migration
rake db:migrate
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.
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
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).
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'}
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.
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.
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