Переполнение cookie в приложении rails? - PullRequest
98 голосов
/ 28 февраля 2012

ActionDispatch :: Cookies :: CookieOverflow в UsersController # create

У меня возникает эта ошибка при попытке открыть страницу.Я не знаю, как отладить эту ошибку.Есть ли у вас какие-либо предложения по этой проблеме?

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

Ответы [ 7 ]

150 голосов
/ 28 февраля 2012

У вас есть ограничение в 4 КБ на то, что вы можете сохранить в cookie, и когда Rails преобразует ваш объект в текст для записи в cookie, он, вероятно, больше этого предела.

Ruby on Rails ActionDispatch::Cookies::CookieOverflow ошибка

Таким образом, возникает ошибка CookieOverflow.

Самый простой способ решить эту проблему - вам нужно изменить ваш session_store и не использовать cookie_store. Вы можете использовать active_record_store в качестве примера.

Вот шаги

  1. Создание миграции, которая создает таблицу сеанса

    rake db:sessions:create
    
  2. Запустить миграцию

    rake db:migrate
    
  3. Изменить config/initializers/session_store.rb с

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

    до

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

После того, как вы выполнили три шага, перезапустите приложение. Rails теперь будет использовать таблицу сессий для хранения данных сессий, и у вас не будет лимита в 4 КБ.

72 голосов
/ 03 сентября 2013

Чтобы функциональность :active_record_store работала в Rails 4/5, вы должны добавить гем activerecord-session_store к вашему Gemfile:

gem 'activerecord-session_store'

затем запустите генератор миграции:

rails generate active_record:session_migration
rake db:migrate

И, наконец, установите хранилище сеансов в config/initializers/session_store.rb:

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

UPDATE:

Если кто-либо получает сообщение null value in column "session_id" violates not-null constraint в рельсах 4, в github есть обходной путь (не тестировался). Вы должны создать инициализатор с ActiveRecord::SessionStore::Session.attr_accessible :data, :session_id

10 голосов
/ 15 января 2013

сообщение об ошибке ясно указывает на проблему с переполнением размера хранилища cookie.

Для устранения этой проблемы ваши сеансы (по умолчанию в cookie) необходимо переместить в хранилище Active record или хранилище memcache.

Для сеансов на базе данных:

config.action_controller.session_store = :active_record_store

Вам необходимо создать таблицу сеансов, как показано ниже

rake db:sessions:create
rake db:migrate

ИЛИ

Для сеансов Memcache:

config.action_controller.session_store = :mem_cache_store

Также вам необходимо настроить сервер кэша памяти и настроить его следующим образом:

config.cache_store = :mem_cache_store, 'localhost', '127.0.0.1:11211',
{:namespace => 'myapp123'}
9 голосов
/ 04 марта 2013

Не рекомендуется хранить объект модели в сеансе.

Проверьте этот Railscast на эту тему: http://railscasts.com/episodes/13-dangers-of-model-in-session?autoplay=true

Лучше хранить идентификатор (в данном случае идентификатор пользователя) внутри сеанса. Тогда у вас не будет этой проблемы.

(См. Также комментарий Фредерика Ченга выше).

7 голосов
/ 14 июля 2017

Если вы видите это, убедитесь, что вы не взорвали некоторые данные сеанса. В моем случае это были тысячи одинаковых сообщений, закачанных во флэш-сообщение. Просто говорю.

2 голосов
/ 29 ноября 2018

Эта ошибка связана с тем, что вы пытаетесь сериализовать пользовательскую модель При хранении объекта в cookie-файлах рельсы будут использовать Marshal.dump , который может производить большое количество контента, поскольку все это записано в записи пользователя

Вместо того, чтобы сохранять фактическую запись пользователя с помощью session[:current_user] = user, попробуйте просто сохранить идентификатор пользователя, а затем найдите метод, способ отыскать пользователя из этого списка. например,

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

def current_user
  @current_user ||= User.find(session[:current_user_id])
end
1 голос
/ 08 мая 2013

Эта ошибка появилась для меня, когда я запускал спецификации. После обновления Capybara с 1.x до 2.x. Просто грабли tmp: clear решил это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...