这条Ruby系列说了什么?

时间:2012-12-01 01:37:40

标签: ruby syntax operator-keyword

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

"#{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 个答案:

答案 0 :(得分:4)

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

"callback(value)"

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

下一部分,()只是原始字符串数据,而不是可执行代码。在()内,您有#{}替换data。如果用xy替换两个可变替代品可能会更清楚:

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

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

答案 1 :(得分:1)

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

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

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

'test({"some": "thing", "goes": "here"})'

答案 2 :(得分:0)

这是一个模板,它将第一个字段替换为实习字符串:callback所映射的选项值,第二个字段替换为内容为data的parens。

我敢打赌,结果字符串将在其他地方被评估,在那里它将变成对程序的调用。这将是这样的:

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执行。

答案 3 :(得分:0)

你可以改写

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

作为

options[:callback].to_s + "(" + data.to_s + ")"