Переполнение 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
по примеру.
Вот шаги
Генерация миграции, которая создает сеансовую таблицу
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 теперь будет использовать таблицу сессий для хранения данных сессий, и у вас не будет ограничения в 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.х. Просто грабли ТМП: ясно, решил это.