Ruby on rails 在Rails 4.0.0中调用“reset_session”在随后的第二页上不起作用

Ruby on rails 在Rails 4.0.0中调用“reset_session”在随后的第二页上不起作用,ruby-on-rails,ruby,session,ruby-on-rails-4,Ruby On Rails,Ruby,Session,Ruby On Rails 4,我一直在Rails 4.0.0中构建一些东西,我发现了一些奇怪的会话行为。我有一个将值写入会话的登录进程。它的缺失是我确定用户未登录的方式: def login session[:user_id] = user.id #Then we render a simple page... end 为了验证我是否有有效的用户,我在我的应用程序\u controller.rb中有一个助手: def current_user logger.info "(current_user) Sess

我一直在Rails 4.0.0中构建一些东西,我发现了一些奇怪的会话行为。我有一个将值写入会话的登录进程。它的缺失是我确定用户未登录的方式:

def login
  session[:user_id] = user.id

  #Then we render a simple page...
end
为了验证我是否有有效的用户,我在我的
应用程序\u controller.rb中有一个助手:

def current_user
  logger.info  "(current_user) Session ID: #{request.session[:user_id]}"
  if session[:user_id] != nil && session[:user_id] != -1 
    User.find(session[:user_id])
  end
end
helper_method :current_user
# Be sure to restart your server when you modify this file.
MyApp::Application.config.session_store :cookie_store, key: '_MyApp_session'

#writes cookies across all subdomain of this site.
Rails.application.config.session_store :cookie_store, :key => '_my_key', :domain => ENV['APP_DOMAIN']
这是从几个不同的地方调用的,用于检查用户状态并决定如何呈现页面。(下面解释了
!=-1
)注销时,我重置会话:

def logout
  reset_session
end
呈现的视图包括调用
当前用户
助手方法来呈现导航。呈现此页面时,我的导航部分显示为没有当前用户,调试日志显示会话变量为已清除。但是,无论我做什么,在下一页它都会恢复到登录状态,我突然让用户再次进行身份验证,这样当前用户就可以从会话中获得正确的值

我尝试给会话分配一个不同的值(例如-1),这也有相同的影响。由于某些原因,我的会话在被删除后被恢复。此外,当我使用以下内容时:

def logout
  reset_session
  redirect_to root_path
end
此时将显示一个已登录用户的索引页。这真是令人讨厌。我很感激我可以使用Desive等,但这确实是关于奇怪的会话行为

我尝试过的事情:

  • 尝试使用
    rake tmp:sessions:clear
    没有效果
  • 用其他内容覆盖会话值
  • 检查_my_key cookie值(该值永远不会更改???)-尽管我在响应头中返回的设置值具有不同的值。。。?这似乎有点奇怪
  • 涡轮连杆已拆下
  • 使用Rails 4.0.0和Ruby 2.0.0 p247
  • Chrome和Safari
我完全被这件事难住了。哦,作为最后一个提示,如果我在浏览器上删除会话cookie,写入会话也会失败。所以我再也没有拿回来

更新

以下是登录日志。我已删除浏览器中的cookie,没有,我不能登录,而是无法注销:

Started GET "/auth/google_oauth2/callbackstate=***************************&code=***********************************" for 127.0.0.1 at 2013-08-26 18:59:15 +0100 
I, [2013-08-26T18:59:15.307731 #7441]  INFO -- omniauth: (google_oauth2) Callback phase initiated.
Processing by UsersController#callback as HTML
  Parameters: {"state"=>"*************************", "code"=>"****************************"}
  User Load (0.9ms)  SELECT "users".* FROM "users" WHERE "users"."uid" = '************************' LIMIT 1
(current_user) Session ID: 1
Setting user_id in session: 1 => [1]
  Account Load (2.4ms)  SELECT "accounts".* FROM "accounts" WHERE "accounts"."id" = $1 ORDER BY "accounts"."id" ASC LIMIT 1  [["id", 1]]
Redirected to http://127.0.0.1:3000/pages
Completed 302 Found in 103ms (ActiveRecord: 7.3ms)


Started GET "/Pages" for 127.0.0.1 at 2013-08-26 18:59:16 +0100
Processing by PagesController#index as HTML
(current_user) Session ID: 
  Rendered public/401.html (1.0ms)
Filter chain halted as :is_authenticated rendered or redirected
Completed 401 Unauthorized in 11ms (Views: 10.8ms | ActiveRecord: 0.0ms)

您可以看到标记为
(当前用户)
的两行代码,它们都是对my helper方法的调用(如上所述)。我使用OmniAuth从Google OAuth获取用户数据,但这并不特别重要。(哎呀…)该死的。我试图使此应用程序成为多租户,并且在我的
会话\u store.rb中有以下内容:

def current_user
  logger.info  "(current_user) Session ID: #{request.session[:user_id]}"
  if session[:user_id] != nil && session[:user_id] != -1 
    User.find(session[:user_id])
  end
end
helper_method :current_user
# Be sure to restart your server when you modify this file.
MyApp::Application.config.session_store :cookie_store, key: '_MyApp_session'

#writes cookies across all subdomain of this site.
Rails.application.config.session_store :cookie_store, :key => '_my_key', :domain => ENV['APP_DOMAIN']

显然,这是不好的,并导致各种疯狂的事情发生在你的饼干和会议。线索应该在
\u my_key
中,我认为这是非标准的?我猜我是从另一个SO问题得到的,没有完全意识到其中的含义

你能解释一下到底是什么问题吗?你的
session\u store.rb现在看起来怎么样?我不得不删除启动
Rails.application的那行代码。。。这导致Rails将其cookie写入另一个键下。然后,当我将cookie重置为注销时,它失败了。删除此行将恢复为默认行为并修复问题。