Ruby on rails Rails-正在清除会话信息?

Ruby on rails Rails-正在清除会话信息?,ruby-on-rails,session,Ruby On Rails,Session,我有一个奇怪的问题,我找不到。。。 对于上下文,我有用户、注册中心和礼品线的资源。每个用户都有许多注册表。每个注册中心都有许多礼品线。对他们来说,这是一种相反的关联 基本上,当我创建giftline时,giftline本身被正确创建,并正确链接到其关联的注册表,但在重定向回注册表显示页面的过程中,会话[:user\u id]变量被清除,我被注销 据我所知,哪里出了问题就在这里的注册处 def show @registry = Registry.find(params[:id])

我有一个奇怪的问题,我找不到。。。 对于上下文,我有用户、注册中心和礼品线的资源。每个用户都有许多注册表。每个注册中心都有许多礼品线。对他们来说,这是一种相反的关联

基本上,当我创建giftline时,giftline本身被正确创建,并正确链接到其关联的注册表,但在重定向回注册表显示页面的过程中,
会话[: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