0

我正在开发我的游戏应用程序中的一些访客帐户功能。如果您注册为游戏用户,那么设计 gem 会自动将当前帐户 ID 加载到会话中。但是当用户是来宾时,正在创建一个帐户和一个具有硬编码值的用户类型对象,并将其成功保存到数据库中。但是当我尝试将对象存储到会话中时,它无法正常工作。

我的代码是这样的,

def play_as_guest
   account = Account.new(email: "guest_#{Time.now.to_i}#{rand(99)}@eossys.com", password: "password", is_guest: true)
   account.save
   game_user = GameUser.new(account: account, game_profile_attributes: {first_name: "Guest", last_name: "guest", nick_name: "guest"})
   game_user.save
   session[:current_account] = game_user
   redirect_to "/game_profiles/#{account.id}/summary"
end

如果我存储帐户 obj session[:current_account] = game_user

这会引发“ActionDispatch::Cookies::CookieOverflow in HomeController#play_as_guest”的错误

如果我尝试 session[:current_account_account] = account

它不起作用,因为在重定向后再次要求登录。因为我使用的是“authenticate_account!” 过滤每个班级。

我想要的基本上是将我创建的帐户对象加载到会话中,就像它是注册用户一样。

我在这里先向您的帮助表示感谢。

4

2 回答 2

0

我认为我们需要您的authenticate_account!过滤器代码来正确回答它,但是对于您的错误,这是因为您尝试将整个对象放入会话中,最好只将id对象放入其中:

session[:current_account] = game_user.id

更新

使用设计,您应该使用该sign_in方法为该用户设置会话,而不是手动设置会话变量,具体取决于您使用设计的方式:

sign_in account或者sign_in game_user

于 2012-11-16T07:00:52.943 回答
0

Rails cookie 的最大限制为 4k ( http://guides.rubyonrails.org/security.html#session-storage )。当您执行类似的操作时obj session[:current_account] = game_user,您正试图将整个 game_user 对象塞入其中,这会导致您因ActionDispatch::Cookies::CookieOverflow您提到的错误而空间不足。这样做的首选方法是只保存 id,像这样obj session[:current_account_id] = game_user.id,并在需要时查找它。即使您的整个对象确实以某种方式适合内存,这也更有效。

于 2012-11-16T07:02:44.780 回答