Переполнение печенья в рельсах?

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

Ответ 1

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

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

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

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

Вот шаги

  • Сгенерировать перенос, создающий таблицу сеанса

    rake db:sessions:create
    
  • Запустите миграцию

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

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

    к

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

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

Ответ 2

Чтобы функциональность :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

Ответ 3

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

Ваши сеансы (по умолчанию в файле cookie) необходимо перенести в активную запись хранилище или хранилище 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

Также вам нужно настроить сервер кэша mem и настроить его, как показано ниже:

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

Ответ 4

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

Посмотрите этот railscast по этой теме: http://railscasts.com/episodes/13-dangers-of-model-in-session?autoplay=true

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

(См. также комментарий Фредерика Чунга).

Ответ 5

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

Я добавлю, что если вы считаете, что решение состоит в том, чтобы увеличить размер вашего хранилища печенья (как и большинство других ответов), вам, вероятно, лучше переосмыслить то, что вы на самом деле вкладываете в cookies. Если вам нужно больше, чем пара токенов авторизации, идентификаторы сеанса и, возможно, несколько файлов макета/отслеживания, вы живете в 90-х годах.

Ответ 6

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

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

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

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

Ответ 7

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