0

所以我在我的应用程序控制器中有一个方法,它将一个对象设置为一个持有对象的会话变量(我知道这不好,但我没有写它。并且该对象没有存储在数据库中):

def current_wine_club_order
  if session[:dynamic_wine_club_order] && session[:dynamic_wine_club_order] != ''
    return session[:dynamic_wine_club_order]
  else
    return WineClubOrderService.new()
  end
end

我的控制器中的这段代码在以下位置中断logger.debug { "#{@wine_club_order.inspect}" }

def new
  @wine_club_order = current_wine_club_order
  logger.debug { "#{@wine_club_order.inspect}" }
  @wine_club_order.current_user = current_user
  @wine_club_order.clear_errors!

  self.current_wine_club_order = @wine_club_order
  logger.debug { "#{@wine_club_order.inspect}" }
end

因此,当我调试时,这就是我在 shell 中得到的:

    >> session
    !! #<NoMethodError: undefined method `[]' for nil:NilClass>
    >> session[:dynamic_wine_club_order]
    !! #<NoMethodError: undefined method `[]' for nil:NilClass>
    >> session[:what]
    => nil
    >> session.class
    => Rack::Session::Abstract::SessionHash
    >> session
    !! #<NoMethodError: undefined method `[]' for nil:NilClass>
    >> session.nil?
    => false

我不明白发生了什么事。会话为零吗?为什么它给了我不同的答案?在我的应用程序控制器中的一个之前的过滤器中,我打印出 session[:dynamic_wine_club_order] 的值是什么,并且它存在于每个请求中:

我的日志:

session[:dynamic_wine_club_order] = #<WineClubOrderService:0x007f8a9a606ef0>

4

1 回答 1

0

我认为问题是因为我在会话中存储的对象具有类似的非 ActiveRecord 对象实例作为其实例变量。我所做的是创建另一个会话变量,仅用于包含关联对象并将其显式设置为原始对象的实例变量的值。

于 2013-06-06T15:39:07.370 回答