Переполнение cookie в приложении rails?

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

8 ответов

Решение

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

Рубин на рельсах 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 КБ.

Чтобы сделать :active_record_store функциональность работает в Rails 4/5, вы должны добавить https://github.com/rails/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'

ОБНОВИТЬ:

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

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

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

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

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

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

Эта ошибка происходит из-за того, что вы пытаетесь сериализовать модель пользователя. При сохранении объекта в cookie- файле rails будет использовать 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

Сообщение об ошибке ясно указывает на проблему с переполнением размера хранилища 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

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

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

моя проблема была из-за кода

      rescue StandardError => e
  flash[:error] = "Error was #{error.message}"
end

в error.message был слишком большим

Эта ошибка появилась для меня, когда я запускал спецификации. После обновления Капибара с 1.х до 2.х. Просто грабли ТМП: ясно, решил это.

Другие вопросы по тегам