【问题标题】:Rails partial template using a custom handler is escaping html使用自定义处理程序的 Rails 部分模板正在转义 html
【发布时间】:2011-11-28 03:29:44
【问题描述】:

我正在使用客户端中的 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 %>

不过,这似乎是一个杂项——必须有一种方法让 erb 渲染器将来自我的处理程序的文本视为 html 安全文本。

【问题讨论】:

  • 所以你的 def compile&lt;%= render ... %&gt; 之间的东西正在对字符串做一些事情,将它发送回“非 HTML 安全”模式。
  • 有道理,但那会是什么?我正在使用 Rails 3.1,否则...
  • 也许你应该使用 raw。检查 [raw vs html_safe vs h][1] [1]:stackoverflow.com/questions/4251284/…

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


【解决方案1】:

也许你应该使用 raw。 Check this

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

【讨论】:

  • 是的,你会这么认为——不幸的是,它也不起作用。不管我做什么,就好像 Rails 自动转义了我的模板处理程序的输出。我想知道此时是否不需要找到某种配置...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-20
  • 2015-06-23
  • 1970-01-01
  • 2018-05-18
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
相关资源
最近更新 更多