2012-03-04 49 views
3

我在控制器上使用動作緩存的操作。不過,我在緩存調用中使用了layout: false標誌,因爲我的佈局具有與用戶相關的信息,例如登錄狀態。這工作完美。沒有佈局的條件佈局和動作緩存

然後我就被添加pjax護欄寶石,基本上添加此代碼到控制器:

layout ->(c) { pjax_request? ? false : 'application' } 

這是對一些請求的佈局不會被渲染。現在我(在邏輯上)想要將這兩種方法結合在一起。

然而,當pjax_request? == true我得到這個錯誤:

There was no default layout for MyController

什麼我做錯了,我怎麼能解決這個問題?


PS:這是最簡單的重複性在這種情況下:

class MyController < ApplicationController 
    layout false 
    caches_action :index, :layout => false 

    def index 
    end 
end 

回答

2

我幾乎認爲這可能是Rails中的錯誤。看看下面的代碼塊左右線143 actionpack/lib/action_controller/caching/actions.rb的:

body = controller.read_fragment(cache_path.path, @store_options) 

unless body 
    controller.action_has_layout = false unless @cache_layout 
    yield 
    controller.action_has_layout = true 
    body = controller._save_fragment(cache_path.path, @store_options) 
end 

body = controller.render_to_string(:text => body, :layout => true) unless @cache_layout 

controller.response_body = body 

它看起來像它的正確渲染身體沒有在第一unless塊的佈局,但後來它迫使模板來渲染一佈局作爲響應主體的一部分。如果你看一下堆棧跟蹤,那就是導致異常的那一行。

我手動編輯的文件到:layout => @cache_layout和視圖呈現爲期望的(因爲它是由一個unless把守其始終計算爲:layout => false)。

我不知道你能做些什麼,而不是臨時修補那個文件,並打開一個錯誤報告。我也可能對這條線的行爲錯誤,但它看起來像是罪魁禍首。

+0

呀就迫使action_has_layout,感謝您的建議。我在那裏砍了一下,寫了一個pull request來解決這個問題:https://github.com/rails/rails/pull/5328。 – 2012-03-07 16:53:26

0

我想也提供了一個解決方案,如果你這樣做,將解決你的問題:

layout Proc.new {|controller| 
    controller.action_has_layout = false 
    false 
} 

從@布蘭登的回答