我有一个疯狂的问题,只在生产中发生。我根本无法在开发中复制它。
出于各种原因,我有以下设置:
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问题,但我不知道该怎么做。
谢谢!
答案 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缓存/线程问题!