强制Rails控制器返回Rack :: Response

时间:2014-01-20 09:57:43

标签: ruby-on-rails ruby rack

我有一个负责处理我的用户的非现场付款的宝石。给定金额和支付网关,它确定如何重定向到网关的支付页面。重定向可以通过GET或自动提交的POST表单,以及各种标题。

我需要它与Sinatra和其他Rack框架兼容,因此它返回一个Rack :: Response。

但是,我无法告诉我的Rails控制器这个 我想要发送给用户的响应,并且它应该只返回它。

我可以轻松地将它集成到Sinatra中:

get '/pay' do
  rack_response = Rack::Response.new(['Hello'], 200, {'Content-Type' => 'text/plain'})
  return rack_response.to_a
end

以下似乎适用于Rails 4:

# test_controller.rb
def pay
  rack_response = Rack::Response.new(['Hello'], 200, {'Content-Type' => 'text/plain'})

  self.response = ActionDispatch::Response.new(*rack_response.to_a)
  self.response.close
  return
end

但是,我无法找到一种优雅的方式使其在 Rails 3.2 应用中运行。我错过了什么吗?

1 个答案:

答案 0 :(得分:3)

这似乎适用于Rails 3.2应用程序

# test_controller.rb
def pay
  rack_response = Rack::Response.new(['Hello'], 200, {'Content-Type' => 'text/plain'})

  self.response_body = rack_response.body
  self.status = rack_response.status
  self.response.headers = rack_response.headers  

  return
end

虽然看起来有点不稳定,但是如果有人有更优雅的方式我会接受它