Переполнение печенья в рельсах?
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 решил это.