Помогите отладить мою сессию? Rails 3 ActionDispatch:: Cookies:: CookieOverflow
Несмотря на то, что я уверен, что знаю, почему эта ошибка возникает, я, похоже, не знаю, почему и как моя сессия превышает предел 4 КБ...
Мое приложение работало нормально, но как только я сознательно начал добавлять ошибки, чтобы проверить, катились ли мои транзакции, я начал получать эту ошибку.
Чтобы дать некоторый фон, я занят кодированием турнирного приложения, которое (в этом разделе) создаст турнир, а затем добавит некоторые турнирные ножки на основе количества команд, а также заполнит турнир некоторыми призрачными светильниками "когда ноги созданы".
Флеш [: турнир] работал правильно раньше; используя объект турнира, у меня есть доступ к любым ошибкам проверки AR, а также данные, которые были введены на предыдущей странице, чтобы создать турнир.
TournamentController.rb
begin
<other code>
Tournament.transaction do
tournament.save!
Tournament.generate_legs tournament
Tournament.generate_ghost_fixtures tournament
end
flash[:notice] = "Tournament created!"
redirect_to :action => :index
rescue Exception => e
flash[:tournament] = tournament
redirect_to :action => :new, :notice => "There was an error!"
end
Tournament.rb
self.generate_ghost_fixtures(tournament)
<other code>
#Generate the ghost fixtures
#tournament_legs is a has_many association
tournament_legs_array = tournament.tournament_legs
tournament_legs_array.each do |leg|
number_of_fixtures = matches[leg.leg_code]
#For the first round of a 32 team tournament, this block will run 16 times to create the matches
number_of_fixtures.times do |n|
Fixture.creatse!(:tournament_leg_id => leg.id, :match_code => "#{leg.leg_code}-#{n+1}")
end
end
end
Я ничего не могу сделать, кроме размышлений о том, почему моя переменная сеанса превышает 4 Кбайт?
Возможно ли, что объект турнира, проходящий через переменную вспышки, содержит все ассоциации?
Вот дамп моей сессии, как только я получу ошибку.
Надеюсь, этого достаточно, чтобы помочь мне:)
Спасибо
Сброс сеанса
_csrf_token: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
flash: {:tournament=>#<Tournament id: nil, tournament_name: "asd", tournament_description: "asdasd", game_id: 1, number_of_teams: 16, start_date: "2011-04-30 00:00:00", tournament_style: "single elimination", tournament_status: "Drafting", active: true, created_at: "2011-04-30 10:07:28", updated_at: "2011-04-30 10:07:28">}
player_id: 1
session_id: "4e5119cbaee3d5d09111f49cf47aa8fa"
Ответы
Ответ 1
О зависимостях, возможно. Также сохранить экземпляр ActiveRecord в сеансе не рекомендуется. Вы должны сохранить только идентификатор. Если вам это нужно во всех ваших запросах, используйте фильтр перед его получением.
Вы можете узнать больше, почему плохая идея: http://asciicasts.com/episodes/13-dangers-of-model-in-session
Ответ 2
Общепринятый и рекомендуемый подход заключается в том, чтобы не использовать перенаправление при ошибке, а вместо этого - прямой рендер. Стандартная "формула контроллера" такова:
def create
@tournament = Tournament.new(params[:tournament])
if @tournament.save
redirect ...
else
render 'new' # which will have access to the errors on the @tournament object and any other instance variable you may define
end
end
class Tournament < ActiveRecord::Base
before_create :set_up_legs
end
При успешном сохранении вы можете удалить все переменные экземпляра (тем самым очистив состояние в памяти) и перенаправить на другую страницу. При отказе (или исключении) вы сохраняете объект в памяти и визуализируете шаблон представления (обычно это страница "новая" или "редактирование" ). Если вы используете стандартную проверку правильности и обработку ошибок, тогда у объекта будет массив ошибок, который вы можете просто отобразить.
Я также рекомендую использовать ассоциации ActiveRecord, которые автоматически предоставляют вам транзакции. Если вы выталкиваете все это в модель, например. метод "set_up_legs" или что-то еще, тогда вы можете использовать обработку ошибок ActiveRecord. Это часть "тощий контроллер, толстая модель" парадигма.
Ответ 3
в session_store.rb, раскомментируйте последнюю строку с помощью: active_record_store
Теперь перезапустите сервер
Ответ 4
Я бы преобразовал исключение в строку, прежде чем назначать его flash [: tournament] с 'to_s'.
У меня была такая же ошибка, и мне кажется, что назначение объекта исключения для сеанса varabla как flash означает, что он берет всю трассировку стека с ним в сеанс. Попробуй, работай для меня.