【问题标题】:How to render URIs safely in erb如何在 erb 中安全地渲染 URI
【发布时间】:2014-08-04 13:08:46
【问题描述】:

我尝试了各种转义和取消转义选项,但不明白为什么我的 erb 无法正确呈现。

我有以下格式的标准图片网址:

 https://i.ytimg.com/vi/pB-5XG-DbAA/hqdefault.jpg;

输入我的控制器如下:

@whats_hot_last_vid = @whats_hot_last.video.picture

当我尝试在我的 js.erb 文件中呈现它时:

var lastsongImg = <%= @whats_hot_last_vid %>;

这是它的渲染方式:

var lastsongImg = https://i.ytimg.com/vi/pB-5XG-DbAA/hqdefault.jpg;

据我所知,它将http地址中的“//”呈现为JS注释的开头,导致引发各种错误,例如

Uncaught SyntaxError: Unexpected token :

有什么想法吗?

【问题讨论】:

  • 尝试转换你的字符串to_json

标签: javascript ruby-on-rails url erb


【解决方案1】:

在 erb 的 js 块中处理此类变量的最佳方法是使用 .to_json。这适用于字符串、数组和哈希(它将转换为 json 对象)。基本上它做的是“正确的事情”,你不必担心根据它是什么类型的对象来包装额外的格式。

//string
var lastsongImg = <%= @whats_hot_last_vid.to_json %>;
// => var lastsongImg = "https://i.ytimg.com/vi/pB-5XG-DbAA/hqdefault.jpg";

//arrays
<% myArray = [1, "abc", 1.6] %>;
var myArrayJs = <%= myArray.to_json %>;
// => var myArrayJs = [1, "abc", 1.6];

//hashes
<% myHash = {:foo => "bar", :chunky => "bacon"} %>;
var myObject = <%= myHash.to_json %>;
// => var myObject = {"chunky":"bacon","foo":"bar"};

编辑:作为旁注,ActiveRecord 对象也有 to_js 方法,并产生这样的对象:

{"car":{"id":123 "color":"red", "make":"Ford", "model": "Mondeo"}}

如果需要,您当然可以为特定模型覆盖此内容。

【讨论】:

  • 这适用于 js.erb 本身。但是如何将数组从 Ruby 传递给 JS?我的控制器中有 /at/users = [['Jon', 'student', 18],['Fred', 'teacher', 36]] 在 Js 中,使用 var myArray = 创造了一个邪恶的混乱,它看起来没有转义,充满了奇怪的字符
  • 这里的/at/users 是什么?是变量名吗?因为它看起来是非法的。
  • 嗨,是的,所以不会让我写通常的“at”标志,因为它认为我在提醒用户,所以我即兴创作了 /at/
  • 使用反引号,例如@users,在 cmets 中写为 `@users`
【解决方案2】:

你必须在字符串周围加上 qoutes,像这样

var lastsongImg = "<%= @whats_hot_last_vid %>";

希望对你有帮助 =)

【讨论】:

  • 谢谢,真不敢相信我错过了这个 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-14
  • 2017-11-11
  • 2013-12-18
  • 2022-12-18
相关资源
最近更新 更多