帮助调试我的会话?Rails 3 ActionDispatch::Cookies::CookieOverflow



尽管我很确定我知道为什么这个错误被提出,我似乎不知道为什么或如何我的会话超过4KB限制…

我的应用程序工作正常,但一旦我故意开始添加错误,看看我的事务是否回滚,我开始得到这个错误。

为了给出一些背景,我正忙着编写一个锦标赛应用程序,(在本节中)将创建锦标赛,然后根据球队数量添加一些锦标赛赛程,并在赛程创建后使用一些"幽灵装置"填充锦标赛。

flash[:tournament]之前工作正常;使用锦标赛对象,我可以访问任何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

我只能推测为什么我的会话变量超过4KB??是否有可能我通过flash变量传递的锦标赛对象也包含所有关联?

这是我得到错误后的会话转储。

希望这是足够的信息来帮助我:)

感谢<<p> 会话转储/em>
_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"

关于依赖关系,这是可能的。另外,在会话中保存ActiveRecord实例也不是推荐的方法。您应该只保存id。如果您在所有请求中都需要它,请使用before过滤器来检索它。

你可以阅读更多为什么是一个坏主意:http://asciicasts.com/episodes/13-dangers-of-model-in-session

一般接受和推荐的方法是不对使用重定向,而是直接呈现。标准的"控制器公式"是这样的:

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

保存成功后,您可以删除所有实例变量(从而清除内存状态)并重定向到另一个页面。如果失败(或异常),您将对象保留在内存中并呈现视图模板(通常是'new'或'edit'表单页面)。如果你使用的是标准的Rails验证和错误处理,那么这个对象将有一个可以直接显示的errors数组。

我还建议您使用ActiveRecord关联,它会自动为您提供事务。如果你把所有这些推到模型中,例如"set_up_legs"方法或其他什么,那么你可以使用ActiveRecord错误处理。这是"瘦控制器,胖模型"范例的一部分。

in session_store。Rb,用:active_record_store取消最后一行的注释现在重新启动服务器

我会将异常转换为字符串,然后将其分配给flash[:tournament]与'to_s'。我有同样的错误,似乎将异常对象分配给会话变量,如flash意味着它将整个堆栈跟踪带入会话。

相关内容

  • 没有找到相关文章

最新更新