Ruby on rails Rails-正在清除会话信息?
我有一个奇怪的问题,我找不到。。。 对于上下文,我有用户、注册中心和礼品线的资源。每个用户都有许多注册表。每个注册中心都有许多礼品线。对他们来说,这是一种相反的关联 基本上,当我创建giftline时,giftline本身被正确创建,并正确链接到其关联的注册表,但在重定向回注册表显示页面的过程中,Ruby on rails Rails-正在清除会话信息?,ruby-on-rails,session,Ruby On Rails,Session,我有一个奇怪的问题,我找不到。。。 对于上下文,我有用户、注册中心和礼品线的资源。每个用户都有许多注册表。每个注册中心都有许多礼品线。对他们来说,这是一种相反的关联 基本上,当我创建giftline时,giftline本身被正确创建,并正确链接到其关联的注册表,但在重定向回注册表显示页面的过程中,会话[:user\u id]变量被清除,我被注销 据我所知,哪里出了问题就在这里的注册处 def show @registry = Registry.find(params[:id])
会话[:user\u id]
变量被清除,我被注销
据我所知,哪里出了问题就在这里的注册处
def show
@registry = Registry.find(params[:id])
@user = User.find(@registry.user_id)
if (params[:user_id] && (@user.login != params[:user_id]) )
flash[:notice] = "User #{params[:user_id]} does not have such a registry."
redirect_to user_registries_path(session[:user_id])
end
end
现在,说清楚了,我可以正常地展示注册表,没有什么奇怪的事情发生。只有当我添加了礼品行时,会话[:user\u id]
变量才会被清除
我使用了调试器,这似乎就是正在发生的事情
(rdb:19) list
[20, 29] in /Users/kriston/Dropbox/ruby_apps/bee_registered/app/controllers/registries_controller.rb
20 render :action => 'new'
21 end
22 end
23
24 def show
=> 25 @registry = Registry.find(params[:id])
26 @user = User.find(@registry.user_id)
27 if (params[:user_id] && (@user.login != params[:user_id]) )
28 flash[:notice] = "User #{params[:user_id]} does not have such a registry."
29 redirect_to user_registries_path(session[:user_id])
(rdb:19) session[:user_id]
"tester"
(rdb:19)
因此,从这里我们可以看到,添加项目后,代码返回到show命令,并且会话[:user\u id]
变量仍然设置
(rdb:19) list
[22, 31] in /Users/kriston/Dropbox/ruby_apps/bee_registered/app/controllers/registries_controller.rb
22 end
23
24 def show
25 @registry = Registry.find(params[:id])
26 @user = User.find(@registry.user_id)
=> 27 if (params[:user_id] && (@user.login != params[:user_id]) )
28 flash[:notice] = "User #{params[:user_id]} does not have such a registry."
29 redirect_to user_registries_path(session[:user_id])
30 end
31 end
(rdb:19) session[:user_id]
"tester"
(rdb:19)
踏上这一步,我们到达了这一点。
而会话[:user\u id]
仍处于设置状态。
此时,URL的格式为localhost:3000/registries/:id
,因此params[:user\u id]
失败,并且if
条件不会发生。(除非我完全错了>。>
是的,只有当我添加了一个giftitem,并且它将我发送回注册表页面时,才会发生这种情况。当我查看它时,会出现相同的代码,但是会话[:user\u id]
变量没有被清除。
这让我有点疯狂
谢谢
--编辑:添加了会话控制器代码--
这是会话控制器代码
class SessionsController < ApplicationController
def new
if session[:user_id]
redirect_to user_registries_path(session[:user_id])
end
end
def create
# authenticate now returns user_id rather than user
if session[:user_id] = User.authenticate(params[:login], params[:password])
#debugger
redirect_to user_registries_path(session[:user_id])
else
flash[:notice] = "The provided username and password either do not match, or do not exist. Please try again."
render :action => 'new'
end
end
def destroy
session[:user_id] = nil
redirect_to users_path
end
end
class sessioncontroller“新建”
终止
终止
def销毁
会话[:用户\u id]=无
将\u重定向到用户\u路径
终止
终止
除了“注销”链接外,其他任何地方都不会调用destroy。当您说注销时,您的会话用户是否已被清除?您已经发布了很多诊断信息,这很好,但您没有公开会话管理的发生方式 @user和您的“登录用户”是否可能是同一个变量?如果是,可能会被替换
通常,最好将其中一个标识为@session\u user,而将reserve@user标识为更通用的变量。我必须承认,我一直在努力找出与用户、注册表所有者等相关的术语。我可能会返回并按照您的建议将名称更改为@session\u user和@user为了我的可读性和理智起见结束。但是是的,我的意思是会话用户被清除。在我的代码中,我一直在使用
session[:user\u id]
以确定我是否有登录用户,在这种情况下,它将被清除,因为它将从显示代码的最后几行中移出,正如我在顶部所包括的。哦,我不确定你指的是“会话管理”是什么意思。我可以展示什么可能会有所帮助?如果您正在使用或自定义会话解决方案,那么您的ApplicationController中会有一些东西来分配您的用户会话变量,不管是什么。不清楚会话[:user_id]是如何分配的,在这里的示例中它不会被修改。您需要定义“注销”的内容means.Yub,我有一个会话模型,在成功的身份验证中设置Session[:user\u id]
。还有一个destroy命令设置Session[:user\u id]调用时将
设置为nil。这就是为什么我被这个问题弄糊涂了。代码中没有修改它,也没有调用会话destroy,所以我不明白为什么在标准ruby代码的部分执行后,它会被设置为nil。我还无法确切地了解该部分的内容标准的ruby代码也可以。在所有这些之后,我发现我使用了“=”而不是“=”在布局过程中被调用的一个助手函数中的if
条件下,调试器中的next
没有进入助手函数,这就是为什么看起来这两段代码之间没有任何内容。但正如我说的Tadman,谢谢heaps。毕竟,这是你的sug我认为我使用的“用户”和“SeStsiuSub”使我遇到了MIS类型的助手函数!
(rdb:19) next
2: session[:user_id] =
/Library/Ruby/Gems/1.8/gems/actionpack-2.3.5/lib/action_controller/filters.rb:618
return index if nesting != 0 || aborted
(rdb:19) list
[613, 622] in /Library/Ruby/Gems/1.8/gems/actionpack-2.3.5/lib/action_controller/filters.rb
613 private
614 def call_filters(chain, index, nesting)
615 index = run_before_filters(chain, index, nesting)
616 aborted = @before_filter_chain_aborted
617 perform_action_without_filters unless performed? || aborted
=> 618 return index if nesting != 0 || aborted
619 run_after_filters(chain, index)
620 end
621
622 def run_before_filters(chain, index, nesting)
(rdb:19) session
{:user_id=>nil, :session_id=>"49992cdf2ddc708b441807f998af7ddc", :return_to=>"/registries", "flash"=>{}, :_csrf_token=>"xMDI0oDaOgbzhQhDG7EqOlGlxwIhHlB6c71fWgOIKcs="}
class SessionsController < ApplicationController
def new
if session[:user_id]
redirect_to user_registries_path(session[:user_id])
end
end
def create
# authenticate now returns user_id rather than user
if session[:user_id] = User.authenticate(params[:login], params[:password])
#debugger
redirect_to user_registries_path(session[:user_id])
else
flash[:notice] = "The provided username and password either do not match, or do not exist. Please try again."
render :action => 'new'
end
end
def destroy
session[:user_id] = nil
redirect_to users_path
end
end