Помогите отладить мою сессию? Rails 3 ActionDispatch :: Cookies :: CookieOverflow - PullRequest
12 голосов
/ 30 апреля 2011

Несмотря на то, что я почти уверен, что знаю, почему возникает эта ошибка, я, похоже, не знаю, почему или как мой сеанс превышает лимит 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 КБ ??Возможно ли, что объект турнира, который я прохожу через переменную flash, также содержит все ассоциации?

Вот дамп моей сессии, как только я получу ошибку.

Надеюсь, этого достаточночтобы выручить меня:)

Спасибо

Дамп сеанса

_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"

Ответы [ 4 ]

13 голосов
/ 12 мая 2011

По поводу зависимостей, это возможно. Также сохранять экземпляр ActiveRecord в сеансе не рекомендуется. Вы должны сохранить только идентификатор. Если вам это нужно во всех ваших запросах, используйте фильтр before для его получения.

Вы можете прочитать больше, почему это плохая идея по адресу: http://asciicasts.com/episodes/13-dangers-of-model-in-session

3 голосов
/ 01 июня 2012

Общепринятый и рекомендуемый подход состоит в том, чтобы не использовать перенаправление при ошибке, а вместо этого прямую визуализацию. Стандартная «формула контроллера» такова:

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

При успешном сохранении вы можете удалить все переменные экземпляра (тем самым стирая состояние в памяти) и перенаправить на другую страницу. В случае сбоя (или исключения) вы сохраняете объект в памяти и вместо этого визуализируете шаблон представления (обычно это страница формы «новый» или «редактировать»). Если вы используете стандартную проверку Rails и обработку ошибок, тогда у объекта будет массив ошибок, который вы можете просто отобразить.

Я бы также рекомендовал вам использовать ассоциации ActiveRecord, которые автоматически дают вам транзакции. Если вы вставите все это в модель, например, метод "set_up_legs" или что-то, то вы можете использовать обработку ошибок ActiveRecord. Это часть "тощего контроллера, толстой модели" парадигмы.

2 голосов
/ 31 мая 2012

Я бы преобразовал исключение в строку перед тем, как назначить его для flash [: tour] с 'to_s'.У меня была та же ошибка, и кажется, что назначение объекта исключения для переменной сеанса, такой как flash, означает, что она переносит весь след стека вместе с ним в сеанс.Попробуй, у меня сработало.

2 голосов
/ 16 марта 2012

в session_store.rb, раскомментируйте последнюю строку с помощью: active_record_store Теперь перезапустите сервер

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...