2010-06-03 61 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

相关问题