2010-11-21 24 views
1

我想弄清楚如何從一個自定義響應者設置佈局。我想使用request.xhr?將渲染布局設置爲'ajax'。有誰知道如何做到這一點? 我用Rails 3,我有這樣的應答:從響應者設置佈局?

module AjaxLayoutResponder 
    def to_html 
    if request.xhr? 
     # do something here to change layout... 
    end 
    super 
    end 
end 

這似乎對我來說,應答是實現這個「AJAX」佈局切換的最佳方式。

回答

1

我不同意應答者是要走的路。下面是我在我的大多數項目(但我只設置了ajax佈局無)用一個簡單的解決方案:

在application_controller.rb

layout :set_layout 

def set_layout 
    request.xhr? 'ajax' : 'application' 
end 
+0

這通常是我做什麼,但這個特殊項目使用爲不同控制器定製的佈局。這將始終使我的佈局「應用程序」,而不是定製的。在我看來,根據請求是否爲ajax來更改佈局,實際上確實符合響應者的描述。爲什麼控制器應該關心?響應者根據請求類型定製響應。這將促進幹代碼重用。而不必爲每個具有非標準佈局的控制器進行自定義的「set_layout」。 – demersus 2010-11-22 16:09:54

+0

啊,我明白了。你有你的控制器命名的佈局嗎?如果是這樣,這樣的東西可能會工作:request.xhr? 'ajax':params [:controller] .singularize – 2010-11-22 20:45:10

+0

這似乎是合乎邏輯的。我將不得不嘗試。謝謝 :) – demersus 2011-01-05 22:48:40

0

你可以簡單地這樣做:

module AjaxLayoutResponder 
    def to_html 
    if request.xhr? 
     options[:layout] = 'ajax' 
    end 
    super 
    end 
end 

因爲所謂的應答器執行的到底是:

# from https://github.com/plataformatec/responders/blob/master/lib/action_controller/responder.rb 
def default_render 
    if @default_response 
    @default_response.call(options) 
    else 
    controller.render(options) 
    end 
end