2012-11-16 51 views
0

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

我的代码是这样的,

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 会话[:current_account] = game_user

这是在投掷的“ActionDispatch ::饼干:: CookieOverflow错误HomeController的#play_as_guest”

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

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

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

感谢您的帮助提前。

+0

sign_in帐户 - 这工作正常。 – Karthikds

回答

0

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

session[:current_account] = game_user.id 

UPDATE

随着色器件,你应该使用sign_in方法来设置该用户的会话,而不是手动设置会话变量,这取决于你如何使用设计则可能是:

sign_in accountsign_in game_user

+0

感谢您的回复。我尝试了会话[:current_account] = game_user.id – Karthikds

+0

至少我的解决方案应该防止'ActionDispatch :: Cookie :: CookieOverflow'为您的身份验证问题作出回答,请为我们提供'authenticate_account!'过滤器的代码。 –

+0

只有当我尝试存储game_user时才会出现该问题。我们只是使用Devise的宝石,并有代码进行身份验证!过滤。如果我将帐户对象存储到会话中,但它的执行没有错误,但它又要求登录。 – Karthikds

0

Rails cookies的最大限制为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,并在需要时查找它。即使您的整个对象以某种方式适合内存,这也会更有效率。

+0

感谢您的帮助。它与会话[:current_account] =帐户正常工作。 – Karthikds

+0

这段代码是否正确session [:current_account] = account.id。 – Karthikds