使用自定义处理程序的Rails部分模板是转义html

时间:2011-09-30 01:53:31

标签: ruby-on-rails-3 actionview ejs

我正在使用客户端中的JavascriptMVC和ejs模板开发Rails 3.1应用程序,以便在我的应用程序上执行一些复杂的功能。不幸的是,ejs语法与erb语法非常相似,我无法将代码保存在同一个文件中(尽管如果有人知道这样做的好方法,我会欣喜若狂)。最终我希望能够在ejs模板中应用一些rails代码(例如I18n)但是在这一点上我会满足于让它工作

按照this question的示例,我创建了一个如下所示的自定义模板处理程序:

module CommonModel
    class Handler < ActionView::Template::Handler
        include ActionView::Template::Handlers::Compilable

        def compile(template)
            template.source.inspect
        end

    end
end

ActionView::Template.register_template_handler :ejs, CommonModel::Handler

然后我创建了一个包含我的ejs代码的部分模板: _jmvc_templates.html.ejs

<script type="text/ejs" id="my_ejs_template">
    <div>Some ejs here</div>
</script>

在我现有的模板中,我尝试包含我的部分:

<%= render 'path/to/my/ejs/templates/jmvc_templates' %>

此时,文件已包含并且我的处理程序已被使用,但所有内容都已转义,因此我的模板中的div会像这样呈现给页面:

&lt;div%gt;

我确定我在这里遗漏了一些明显的东西,但我不知道它可能是什么......我怎样才能让这个模板处理程序只包含我的基于ejs的模板而不转义其中的所有html ?

修改

我发现用html_safe调用render是有效的:

<%= render('path/to/my/ejs/templates/jmvc_templates').html_safe %>

这看起来像一个kludge - 必须有一种方法让erb渲染器将我的处理程序中的文本视为html安全文本。

1 个答案:

答案 0 :(得分:0)

也许你应该使用raw。 Check this

def compile(template)
  raw template.source.inspect
end