0

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

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

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 方法,我认为应该如此。

但令人难以置信的是,在上述考试中,订单页面没有以公共布局呈现!!??它使用“app/dmvcs”布局(WTF!?)呈现。我已经检查并三重检查和 mobile_view?在桌面上是 FALSE,但它仍然使用错误的布局。

更奇怪的是,如果我有这个:

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

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

有没有人见过这样的事情?显然,这似乎是某种奇怪的缓存或 nginx 问题,但我不知道该怎么做。

谢谢!

4

1 回答 1

0

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

     self.class.layout 'apps/dmvcs' 

当我读到一些线程安全问题时,从 CommonController 开始,然后我将select_layoutPublicController 中的方法更改为:

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

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

于 2012-11-28T17:28:02.820 回答