2012-12-01 130 views
0

我正在使用自定義渲染器,並使用了另一個站點的一些複製粘貼。我似乎無法弄清楚這件作品在這裏做了什麼。這條Ruby線說什麼?

"#{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

這是簡單的字符串插值。它會產生一個像這樣的字符串,其中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代替兩個變量substituions這可能是更清楚:

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

以上將評估字符串"3(4)"

1

這是轉換JSON響應JSONP;想象data是:

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

JSONP指出,數據應該被包裹在一個JavaScript函數調用。所以options[:callback]是字符串test(要調用的函數的名稱),所產生的JSONP是:

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

不,#{}符號是字符串插值。 –

+0

對 - 我想技術上是正確的,我應該用引號將行包好。我還懷疑我誤解了這個問題「這個代碼的目的是什麼」,而不是字面意思是「它在做什麼」。 :) –

0

這與選項由實習字符串:callback poiinted的值替換第一場模板,第二個字段,內容爲data

我敢打賭,結果字符串將在其他地方被評估,在那裏它將成爲一個程序的調用。這將工作是這樣的:

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

(請注意,數據被編碼成JSON,所以數據傳遞是一個JSON字符串

,則字符串變成「富(ARG。 .arg.arg)「,並且當它被評估時,它將變成對這些參數的例程foo的調用。

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

更新:

其實,我把它收回有關紅寶石EVAL - 儘管這樣做工作,它更可能變成一個JavaScript函數調用。然後,這可以讓你將一個javascript函數的名稱作爲一個字符串傳遞,代碼將在稍後返回適當的回調函數供JavaScript執行。

0

可以重寫

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

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