Rails 3 - 将HTTP状态更改为200并将状态添加到响应正文

时间:2011-07-06 06:37:44

标签: flash ruby-on-rails-3

我需要捕获HTTP响应,就像它离开rails并重写一样,如下所示:

  1. 创建一个状态码为的根状态节点,然后
  2. 将标题状态重写为200
  3. EG。对于所有响应,将其状态设置为根节点,然后重写其标题:

    HTTP/1.1 404 Not Found
    Content-Type:text/html
    
    This page was not found
    

    进入这个:

    HTTP/1.1 200 OK
    Content-Type: text/html
    
    <status='404'>
    This page was not found
    </status>
    

    背景: 将Rails 3与Flash客户端一起使用。

    由于浏览器的限制,无法保证HTTP 200以外的任何其他内容都能传递到客户端。有些允许201到,但不是全部。此外,任何标题都会在大部分时间被删除,只有身体才能通过。

1 个答案:

答案 0 :(得分:1)

我会使用Rack-Middleware,因为它很容易处理标题并重写正文。 把它放进app/middleware/flashfix.rb

    class FlashFix
      def initialize(app)
        @app = app
      end

      def call(env)
        status, headers, response = @app.call(env)
        if status == 404 
          [200, headers, "<status='404'>" + response.body + "</status>"]
        else
          [status, headers, response]      
        end
      end
    end

这只是检查Rails是否返回状态代码为“404”的响应,然后相应地重写响应。 然后在一个初始化器中:

     # Loops through all middlewares and requires them
     Dir[File.join(Rails.root,"app/middleware/*.rb")].each do |middleware|
       require middleware
     end

使用中间件,您需要做的就是告诉Rails使用它

    class Application < Rails::Application
      config.middleware.use "FlashFix"          
    end 

如果您不熟悉Rack,我建议http://guides.rubyonrails.org/rails_on_rack.html