0

我正在使用自定义渲染器,并且使用了来自另一个站点的一些复制粘贴。我似乎无法弄清楚这件作品在这里做什么。

"#{options[:callback]}(#{data})"

这是完整上下文中的一段代码。

  ActionController.add_renderer :as3 do |data, options|
    data = ActiveSupport::JSON.encode(data) unless data.respond_to?(:to_str)
    data = "#{options[:callback]}(#{data})" unless options[:callback].blank?
    self.content_type ||= Mime::JSON
    self.response_body = data
  end
4

4 回答 4

4

这是简单的字符串插值。它将产生一个像这样的字符串,其中callback的值是options[:callback],并且value是变量中的任何内容data

"callback(value)"

在 Ruby 中,双引号字符串支持通过#{}语法进行插值。也就是说,如果您有一个x包含 value的变量3,则该字符串"The value of x is #{x}"将被评估为"The value of x is 3"。在 a#{}中,您可以拥有任意复杂的 Ruby 表达式,包括数组/哈希索引。因此,字符串的第一部分"#{options[:callback]}"只是将值替换options[:callback]到字符串中。

下一部分()是简单的原始字符串数据,而不是可执行代码。在 中(),您有第二个#{}替换data。如果将两个变量替换为xand可能会更清楚y

 x = 3
 y = 4
 "#{ x }(#{ y })"

以上将评估为字符串"3(4)"

于 2012-12-01T01:39:34.167 回答
1

这是将 JSON 响应转换为 JSONP;想象data是:

'{"some": "thing", "goes": "here"}'

JSONP 声明数据应该包装在 JavaScript 函数调用中。因此 ofoptions[:callback]是字符串test(要调用的函数的名称),生成的 JSONP 将是:

'test({"some": "thing", "goes": "here"})'
于 2012-12-01T01:40:11.333 回答
0

它是一个模板,将第一个字段替换为由 interned string 指向的选项的值,:callback第二个字段在括号内替换为data.

我敢打赌,生成的字符串将在其他地方进行评估,在那里它将成为对过程的调用。这将像这样工作:

options[:callback] = "foo"
data="arg,arg,arg"

(请注意,数据被编码为 JSON,因此作为数据传递的字符串是 json 字符串。

然后字符串变成“foo(arg.arg.arg)”,当它被评估时,它变成了对foo带有这些参数的例程的调用。

http://www.ruby-doc.org/core-1.9.3/Kernel.html#method-i-eval

更新:

实际上,我收回了关于 Ruby eval 的看法——虽然这可行,但它更有可能变成 Javascript 函数调用。然后,这将允许您将 javascript 函数的名称作为字符串传递,并且代码将返回适当的回调函数以供 javascript 稍后执行。

于 2012-12-01T01:40:20.643 回答
0

你可以重写

"#{options[:callback]}(#{data})"

作为

options[:callback].to_s + "(" + data.to_s + ")"
于 2012-12-01T01:53:38.317 回答