在我的应用程序中,我让用户输入注释,这些注释可能不安全。当我在视图中渲染它们时,下面很好地显示了注释:
<%= 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_format
和h
方法仅在视图中可用。
或者我应该真的在Javascript中做所有事情吗?
答案 0 :(得分:1)
我认为你可以使用helpers
每个只用他们的长名称来呼叫它们的地方:
ActionController::Base.helpers.simple_format str
ERB::Util::html_escape str
完成此操作后,您可以customize your Model.to_json
behavior添加已经解析过的Model.body
版本。
当然,这种方法存在两个问题:
但有时候试图避免这些问题带来的复杂性要高于清晰度。
答案 1 :(得分:0)
您可以像对待html一样从erb模板返回JSON。而不是在控制器中返回JSON,让它通过不进行渲染,就像html响应一样。而不是命名视图index.hmtl.erb,将其命名为index.json.erb。
我不确定这是最干净的方式。这是Rails为响应html或其他方式提供simple_format的唯一方法。