我正在使用自定义渲染器,并且我使用了来自其他网站的一些复制粘贴。我似乎无法弄清楚这件作品在这里做了什么。
"#{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
答案 0 :(得分:4)
这是简单的字符串插值。它将生成一个这样的字符串,其中callback
是options[: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
。如果用x
和y
替换两个可变替代品可能会更清楚:
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 + ")"