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' 

いくつかのスレッドセーフの問題について読んだ後select_layout、PublicControllerのメソッドを次のように変更しました。

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

そして、それはすべて現在機能しているように見えます。監視を続ける必要がありますが、それはひどく面倒でした。Railsのキャッシング/スレッドの問題に対処したい場合を除いて、他の誰かがbefore_filterでレイアウトを設定するのを避けるのに役立つことを願っています!

于 2012-11-28T17:28:02.820 に答える