2

在我的应用程序中,我让用户输入注释,这可能是不安全的。当我在视图中渲染它们时,以下很好地显示了注释:

<%= simple_format h annotation.body %>

它保留了换行符,但也正确地转义了 HTML。现在,我需要在由 Javascript 创建的叠加层中呈现这个主体。现在,我通过从控制器调用以下命令通过 JSON 获取我的注释:

def index
  # ...
  respond_to do |format|
    format.json { render :json => @annotations }
  end
end

并像这样创建叠加层(非常简化的示例):

$.getJSON(this.annotations_url, function(data) { 
  $.each(data, function(key, val) {
      annotation = val;
      this.div_body.html(annotation.body);
      // ...

当然,生成的 HTML不会被正确转义,并且换行符也不会被保留。


现在,我不想使用纯 Javascript 来进行转义和换行转换,因为如果我这样做的话,我感觉我不会干很多。整个代码似乎很难维护和混乱。

我不能以某种方式通过 JSON 从控制器发送安全的 HTML 正文吗?看起来好像 ERBsimple_formath方法仅在视图中可用。

或者我真的应该用 Javascript 做所有事情吗?

4

2 回答 2

1

我认为您可以在helpers每个地方使用他们的长名来称呼他们:

ActionController::Base.helpers.simple_format str
ERB::Util::html_escape str

一旦你有了这个,你就可以自定义你的Model.to_json行为来包含一个已经解析过的Model.body.

当然,这种方法有两个问题:

  1. 模型中的 Rails 依赖项
  2. 在模型中添加视图行为

但有时试图避免这些问题带来的复杂性多于清晰度。

于 2012-05-13T11:01:49.303 回答
0

您可以从 erb 模板返回 JSON,就像对 html 一样。与其在控制器中返回 JSON,不如让它不进行渲染,就像 html 响应一样。不要将视图命名为 index.hmtl.erb,而是将其命名为 index.json.erb。

我不确定这是最好的最干净的方法。这是 Rails 为响应 html 或其他内容提供 simple_format 的唯一方式。

于 2012-05-13T10:53:16.650 回答