Подтвердить что ты не робот

Помогите отладить мою сессию? 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"
4b9b3361

Ответ 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 означает, что он берет всю трассировку стека с ним в сеанс. Попробуй, работай для меня.