2012-10-11 43 views
3

我添加不顯眼的AJAX到我的網站,所以我需要設置佈局取決於請求類型:返回默認佈局行爲使用一個Proc

# app/controllers/application_controller.rb 
layout Proc.new { |controller| controller.request.xhr? ? 'ajax' : 'application' } 

# app/views/layout/ajax.html.erb 
<%= render :partial => "shared/flash", :object => flash %> 
<%= yield %> 

但我也想使用嵌套的佈局和有我的JavaScript處理插入ajax檢索內容的位置。根據與繼承rails api佈局爲零力默認佈局的行爲,所以我嘗試這樣做:

layout Proc.new { |controller| controller.request.xhr? ? 'ajax' : nil } 

不工作,我沒有得到任何佈局都沒有。我發現的唯一一條信息是舊的聊天記錄,說這確實不起作用,因爲Rails處理佈局的方式。

有沒有辦法做到這一點?

由於proc返回的nil不起作用,是他們在遇到遇到的情況下設置佈局的一種方法(request.xhr?here)。像layout_if。

或者我應該只需要添加

layout Proc.new { |controller| controller.request.xhr? ? 'ajax' : 'controller_name' } 

到每個控制器有不同的佈局?

我的ajax請求實際上返回html,我應該作弊一點,並在.xml文件中返回這些html元素,並使用respond_to來設置佈局? (這可能是很大的,還有另外一個原因,有型動物的URL與不版面內容訪問可能允許頁面緩存,但也有其他的方式來實現這一目標。)

或者,也許有一個辦法更好的解決方案。

回答

1

Rails可以自動執行此操作。例如,您創建2個佈局(application.html.erbapplication.js.erb)。當請求是xhr?它將使用js(application.js.erb)佈局,如果標準請求來到服務器軌道將呈現application.html.erb