即使我很确定我知道为什么会出现这个错误,但我似乎不知道我的会话为何或如何超过4KB限制...
我的应用程序工作正常,但一旦我故意开始添加错误,看看我的交易是否回滚,我就开始收到此错误。
为了给出一些背景信息,我正在忙着编写锦标赛应用程序(在本节中)将创建锦标赛,然后根据团队数量添加一些锦标赛分支,并用一些'幽灵装置填充锦标赛“一旦腿被创造出来。
闪光[:锦标赛]之前正常运作;使用锦标赛对象,我可以访问任何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变量的锦标赛对象是否也可能包含所有关联?
一旦出现错误,这是我的会话转储。
希望这足以帮助我解决问题:)
由于
会话转储
_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"
答案 0 :(得分:13)
关于依赖关系,这是可能的。同样在会话中保存ActiveRecord实例不是推荐的方法。你应该只保存id。如果您在所有请求中都需要它,请使用前置过滤器来检索它。
您可以在http://asciicasts.com/episodes/13-dangers-of-model-in-session
了解更多为什么是个坏主意答案 1 :(得分:3)
普遍接受和推荐的方法是不在错误时使用重定向,而是直接渲染。标准的“控制器公式”是这样的:
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错误处理。这是"skinny controller, fat model"范例的一部分。
答案 2 :(得分:2)
在session_store.rb中,取消注释最后一行:active_record_store 现在重启服务器
答案 3 :(得分:2)
我会在将异常转换为带有'to_s'的flash [:tournament]之前将异常转换为字符串。 我有同样的错误,它似乎将一个异常对象分配给像flash这样的会话变量意味着它将整个堆栈跟踪带入会话。试试吧,为我工作。