将HTML从控制器传递到Javascript的正确方法是什么?

时间:2012-05-13 10:38:46

标签: javascript html ruby-on-rails escaping

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

<%= 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主体吗?看起来ERB simple_formath方法仅在视图中可用。

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

2 个答案:

答案 0 :(得分:1)

我认为你可以使用helpers每个只用他们的长名称来呼叫它们的地方:

  

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

完成此操作后,您可以customize your Model.to_json behavior添加已经解析过的Model.body版本。

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

  1. 模型中的Rails依赖
  2. 在模型中添加视图行为
  3. 但有时候试图避免这些问题带来的复杂性要高于清晰度。

答案 1 :(得分:0)

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

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