在Rails 3中处理JS/ERB模板中的JSON

Mic*_*man 32 ajax jquery json ruby-on-rails erb

使用JSON对象和jQuery-rails(jQuery库加上特殊的rails.js文件)进行Rails(3)的典型AJAX调用没有任何问题.

但是,在一个控制器中,我想在AJAX调用之后在erb模板(create.js.erb)中返回一些JSON.

我已经尝试了控制器中的每一个组合(@ object.to_json,'[{"content":"hello world"}]'等等)和模板本身(JSON.parse(),单引号,双引号等),但对象继续这样渲染:

'[{"groups":{},"created_at":"2010-09-21T03:49:34Z" ...
Run Code Online (Sandbox Code Playgroud)

结果,我的jQuery代码无法解析它,我得到错误.

我如何在控制器中准备我的对象,以及在视图中我需要什么erb语法才能呈现为有效的JSON对象?

非常感谢!

ale*_*dev 54

我不确定这是原因,但你也可以尝试使用html_safe方法.ERB可能正在逃避您的JSON,因为它认为它不是html安全的.尝试在使用字符串时调用该方法:

@object.to_json.html_safe
Run Code Online (Sandbox Code Playgroud)

  • 注意:如果您将结果嵌入到脚本标记中,则在不转义的情况下调用html_safe会导致XSS漏洞. (20认同)

Joh*_*ohn 32

使用html_escaperaw单独使用会使您容易受到XSS攻击.

相反,定义json_escape(又名j)助手的合理版本:

module ActionView::Base
  def json_escape(s)
    result = s.to_s.gsub('/', '\/')
    s.html_safe? ? result.html_safe : result
  end

  alias j json_escape
end
Run Code Online (Sandbox Code Playgroud)

像这样使用它:

<script>
  var Accounts = new Backbone.Collection;
  Accounts.reset(<%=j @accounts.to_json.html_safe %>);
  var Projects = new Backbone.Collection;
  Projects.reset(<%=j @projects.to_json(:collaborators => true).html_safe %>);
</script>
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅此帖子.

要知道,有一个命名冲突之间j化名为json_escape在ERB ::的Util并j化名为escape_javascript在::的ActionView ::助手JavaScriptHelper.我希望将JavaScriptHelper别名重命名为js.

  • 这个答案应该是被接受的答案 - 互联网上有多少帖子建议在不逃避的情况下使用html_safe,这真的令人震惊. (4认同)