In rails, can I access response.body in a action before it returns?

后端 未结 4 1417
無奈伤痛
無奈伤痛 2021-01-05 11:08

In rails, can I access response.body in a action before it returns?

Say I want to do some final string replacements before it returns, can I get access to response.b

相关标签:
4条回答
  • 2021-01-05 11:14

    The poor-man's way is to do this:

    str = render_to_string "mycontroller/mytemplate"
    str.gsub!(/blah/,'')
    render :text => str 
    
    0 讨论(0)
  • 2021-01-05 11:15

    Try after_filter in your controller.

    You should be able to edit your response.body from there. For me, I needed to remove some ASCII characters in the xml hence I did this.

    after_filter :sanitize_xml
    
    def sanitize_xml
       #clean the response body by accessing response.body
    
    0 讨论(0)
  • 2021-01-05 11:21

    You can write a rack middleware to do such kind of replacements. Code for the rack is.

    module Dump
      require 'rack'
    
      class Response
        def initialize(app)
           @app=app
        end
    
        def call(env)
           res=@app.call(env)
           res.body #change this and but also update res.length and header["Content-Length"]
           return res
        end
      end
    end
    

    include it in some file, lets call it dump_response.rb in RAILS_ROOT/lib folder. And line

    use Dump::Response
    

    in config.ru

    0 讨论(0)
  • 2021-01-05 11:29

    You can simply overwrite rails render function in a controller, like this:

    def render *args, &block
      super
      response.body.gsub!(/blah/,'')
    end
    
    0 讨论(0)
提交回复
热议问题