2010-03-15 109 views
11

大多數情況下,我不希望在請求來自AJAX時渲染布局。爲此,我一直在我的控制器操作中經常寫render :layout => !request.xhr?從不渲染布局以響應xhrs

我該如何做到這一點默認?也就是說,我希望能夠寫

def new 
    Post.find(params[:id]) 
end 

和具備的功能是

def show 
    Post.find(params[:id]) 
    render :layout => !request.xhr? 
end 

(我沒事手動中,我想用一個罕見的情況下,指定佈局)

+0

不能只讓AJAX調用使用不同的URL? – 2010-03-15 03:11:18

回答

11

這個怎麼樣?

class UsersController < ApplicationController 
    layout proc {|controller| controller.request.xhr? ? false: "application" } 
end 
+1

並在Rails 3中工作! – gertas 2011-03-16 20:58:12

1

正常的after_filter不起作用,因爲我們想修改渲染。

劫持渲染怎麼樣?

class ApplicationController < ActionController::Base 

    private 
    def render(options = nil, extra_options = {}, &block) 
    options = {:layout => !request.xhr?}.merge(options) unless options.nil? 
    super(options, extra_options)  
    end 
end 

在調用render來覆蓋它時設置佈局。有點醜,但應該工作。

+0

這不起作用 - 它只是立即調用'render'(在我的控制器有機會爲我的視圖設置環境之前) – 2010-03-15 05:24:34

+0

當然,過濾器在這裏不起作用......我的壞!更新的解決方案是否有訣竅? – anshul 2010-03-15 10:21:09

4

爲了使其成爲默認從未渲染任何XHR請求的佈局,你可以這樣做:

class ApplicationController < ActionController::Base 
    layout proc { false if request.xhr? } 
end 

當請求是XHR請求時,它呈現請求沒有佈局的視圖。否則,它使用默認的佈局行爲,通過繼承查找佈局。

這是不是說controller.request.xhr? ? false : 'application'不同的,因爲這將總是呈現application佈局非XHR請求,通過繼承有效地禁用查找。

另請參閱ActionView documentationnil參數和佈局繼承。