随机布局和before_filters的生产问题

时间:2012-11-28 15:34:46

标签: ruby-on-rails ruby-on-rails-3 caching nginx before-filter

我有一个疯狂的问题,只在生产中发生。我根本无法在开发中复制它。

出于各种原因,我有以下设置:

class OrdersController < PublicController
class PublicController < CommonController
class CommonController < ApplicationController

在CommonController内部,我有一个这样的方法:

def mobile_ready
 # set request format
  if mobile_view?
    request.format = :mobil      
    self.class.layout 'apps/dmvcs' 
  else 
    request.format = :html
  end 
end

现在这里的事情变得奇怪了:

在OrdersController中我有这个:

before_filter :mobile_ready

并在PublicController中我有:

layout :select_layout

protected 

def select_layout
    mobile_view? ? 'public_mobile' : 'public'
end

我已经跟踪了调用的顺序,并且在select_layout之前调用了mobile_ready方法,我相信它应该是。

但令人难以置信的是,在上述考试中,订单页面不会与公共布局呈现!! ??它使用&#39; app / dmvcs&#39;进行渲染。布局(WTF!?)。我已经检查过三重检查和mobile_view了吗?在桌面上是假的,但它仍然使用错误的布局。

如果我有这个,那么WEIRDER是什么:

class PublicController < CommonController
  layout 'public' # set this so there is a default layout
  layout :select_layout 

它可以在70%的时间内工作,这意味着它可能会呈现正确的布局,也可能不会!

以前有人见过这样的事吗?它显然看起来像某种奇怪的缓存或nginx问题,但我不知道该怎么做。

谢谢!

1 个答案:

答案 0 :(得分:0)

这让我疯了,我不是100%我有正确的解决方案,但长话短说我删除了

     self.class.layout 'apps/dmvcs' 
当我读到一些线程安全问题时,来自CommonController的

然后我将PublicController中的select_layout方法更改为:

def select_layout
 if mobile_view?
   if request.format == :mobile
     'apps/dmvcs' 
   else
     'public_mobile'
   end
 else
   'public'
 end
end

所有似乎现在都在工作。我必须继续监控,但这很烦人。希望这有助于其他人避免在before_filter中设置布局,除非他们想要处理Rails缓存/线程问题!