2010-06-03 72 views
1

我可以做request.path_parameters ['controller']和request.path_parameters ['action'],但是有什麼像request.path_parameters ['template'],所以我可以辨別哪個模板文件(如index.html。 erb)正在渲染?在Rails中是否有一個變量等同於正在呈現的模板?

我正在寫自動套在身上ID爲模板的方法被呈現,便於操控的CSS:

class ApplicationController < ActionController::Base 
    ... 
    after_filter :define_body_selector 
    ... 
    def define_body_selector 
    # sets @body_id to the name of the template that will be rendered 
    # ie. if users/index.html.erb was just rendered, @body_id gets set to "index" 
    @body_id = ??? 
    end 
    ... 

回答

0

如果你有不同的模板文件,你可以用它們content_for(檢查出guide about layouts and templates)在佈局文件中設置ID,或者只是堅持params[:action](這應該足夠了 - 模板的選擇基於所調用的操作)。

你可以讓所有的萬能before_filter(或不是全部)行爲與

before_filter :set_id_for_body, :only => [...] 

def set_id_for_body 
    @body_id = params[:action] 
end 

總是想着如何讓你的代碼乾的!


編輯:

您可以定義哈希將與匹配模板鏈接操作:

ActionClasses = { 
    :update => "show", 
    :show => "show, 
    :new => "new", 
    :edit => "new", 
    ... 
} 

在你的佈局文件只需添加

<body id="<%= ActionClasses[params[:action]] %>"> 

編輯:

有可能通過ActionBase::template方法來訪問模板,但它不會工作,你會喜歡它的方式。如果在佈局文件中調用filenamename方法,您將獲得佈局文件的路徑,而不是模板。 AFAIK無法檢查正在渲染的模板,因爲它們中的多個模板可用於渲染單個動作。

+0

謝謝,samuil。但params [:action]不能正常工作,因爲雖然有時「show」動作會呈現「show」頁面,但有時「update」動作也會呈現「show」頁面。我需要一種方法將明確設置爲所呈現模板的名稱(不管操作如何)。 「content_for」是一種解決方法,它使我能夠在每個模板文件中顯式設置主體ID,但需要在創建的每個模板文件中重複插入該行。 – 2010-06-03 22:59:55

+0

我有一個稍微不同的情況下,在我的情況下,有幾個theme_paths添加到模板解析器,並基於模板可用性模板從主題1或主題2等摘取,我想知道它在哪裏是theme2/theme1 – 2016-01-05 04:41:15

0
@body_id = params[:action] 
+0

問題是,雖然有時「顯示」操作呈現「顯示」頁面,但有時「更新」操作也呈現「顯示」頁面。我需要一種方法將明確設置爲所呈現模板的名稱(不管操作如何)。 – 2010-06-03 22:55:21

相關問題