【问题标题】:What is the proper way of passing HTML from the controller to Javascript?将 HTML 从控制器传递到 Javascript 的正确方法是什么?
【发布时间】:2023-03-06 13:33:01
【问题描述】:

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

<%= 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 做所有事情吗?

【问题讨论】:

    标签: javascript html ruby-on-rails escaping


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我认为你可以在任何地方使用helpers,只要用他们的长名来称呼他们:

      ActionController::Base.helpers.simple_format str
      ERB::Util::@987654321@ str

      一旦你有了这个,你可以customize your Model.to_json behavior 包含一个已经解析的Model.body 版本。

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

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

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

      【讨论】:

      • 这很好用,我只是在渲染之前将代码添加到format.json 块中。它现在在控制器中,但仍然比在 JS 中更好。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-20
      • 1970-01-01
      • 2011-01-22
      • 2018-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多