1

我正在使用 Rails 2.3,我决定为 JSONP 提供支持。创建了一个全新的应用程序。然后运行脚本/生成脚手架用户名:字符串

这是我的整个环境.rb

RAILS_GEM_VERSION = '2.3.2' unless defined? RAILS_GEM_VERSION
require File.join(File.dirname(__FILE__), 'boot')
require 'rack/contrib'
Rails::Initializer.run do |config|
 config.middleware.use 'Rack::JSONP'
end

当我访问 localhost:3000/users 时,我得到的只是一个哈希值。当我访问 localhost:3000/users.js?callback=show 时,我得到了很好的结果。

让我们看一下jsonp代码。我不明白为什么响应被包装在一个数组中。

我创建了另一个 Rack 中间件,我替换了这个语句

      [status, headers, [response]]

有了这个声明

      [status, headers, response]

现在一切正常。

我拒绝相信这是 rack-contrib 中的一个错误。

有人可以告诉我为什么响应被包装在一个数组中,以及我如何在我的应用程序中使用 rack-contrib。

我的应用程序的完整源代码在这里。只需克隆它并在 localhost:3000 上运行。

4

1 回答 1

2

那个代码是错误的。应该是这样的:

def call(env)
  status, headers, response = @app.call(env)
  request = Rack::Request.new(env)
  if request.params.include?('callback')
    response = [pad(request.params.delete('callback'), response)]
    headers['Content-Length'] = response.length.to_s
  end
  [status, headers, response]
end

在参数不包含回调的情况下,它错误地将响应包装在数组中。在 params 包含回调的情况下,它需要将响应包装在数组中的原因是因为 Rack 响应必须响应 .each()。

于 2009-09-03T14:56:25.450 回答