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、値を含む変数がある場合3、文字列"The value of x is #{x}"は に評価され"The value of x is 3"ます。の内部には#{}、配列/ハッシュ インデックスを含む任意の複雑な Ruby 式を含めることができます。したがって、文字列の最初の部分は、"#{options[:callback]}"単純に の値を文字列に代入options[:callback]しています。

次の部分は、()実行可能コードではなく、単なる生の文字列データです。の内部には()、 の 2 番目#{}の置換がありdataます。2 つの変数置換をxおよびに置き換えると、より明確になる可能性があり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

あなたは書き直すことができます

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

なので

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

これは、最初のフィールドをインターンされた文字列によって指定されたオプションの値に置き換え、:callback2 番目のフィールドを括弧内の の内容に置き換えるテンプレートですdata

結果の文字列が別の場所で評価され、そこでプロシージャの呼び出しになることに賭けます。それは次のように機能します:

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

(データは JSON にエンコードされているため、データとして渡される文字列は json 文字列であることに注意してください。

文字列は "foo(arg.arg.arg)" に変わり、eval されると、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 に答える