Ruby on Rails - ApplicationController

时间:2012-11-16 06:37:20

标签: ruby-on-rails session devise

正在我的游戏应用程序中处理一些来宾帐户功能。如果您注册为游戏用户,则设计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

这是在HomeController#play_as_guest中抛出“ActionDispatch :: Cookies :: CookieOverflow”的错误

如果我尝试 会话[:current_account_account] =帐户

它无法正常工作,因为重定向后再次要求登录。因为我正在使用'authenticate_account!'在每个班级过滤。

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

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

id

更新

使用设计时,您应该使用session[:current_account] = game_user.id 方法为此用户设置会话,而不是手动设置会话变量,具体取决于您使用设备的方式:

sign_insign_in account

答案 1 :(得分: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,并在需要时进行查找。这样效率要高得多,即使你的整个对象确实以某种方式适合内存。