所以我在我的应用程序控制器中有一个方法,它将一个对象设置为一个包含一个对象的会话变量(我知道它不好,但我没有写它。而且该对象没有存储在数据库中):< / p>
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>
答案 0 :(得分:0)
我认为问题是因为我在会话中存储的对象具有与其实例变量类似的非ActiveRecord对象实例。我所做的是创建另一个会话变量,仅用于包含关联对象并将其显式设置为原始对象的实例变量的值。