Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save lukaszkorecki/393246 to your computer and use it in GitHub Desktop.
Save lukaszkorecki/393246 to your computer and use it in GitHub Desktop.
class ApplicationController < ActionController::Base
protected
def _log msg, is_json=false, level=:notice
request.env[is_json ? 'firebug.logs_obj' : 'firebug.logs'] ||=[]
request.env[is_json ? 'firebug.logs_obj' : 'firebug.logs'] = [[level.to_sym, (is_json ? msg.to_s.to_json : msg.to_s)]]
end
end
module Rack
class FirebugLogger
def initialize(app, options = {})
@app = app
@options = options
end
def call(env)
status, headers, orig_response = @app.call(env)
return [status, headers, orig_response] unless (headers["Content-Type"] =~ /html/ && (env['firebug.logs'] || env['firebug.logs_obj']))
new_response = Rack::Response.new([], status, headers)
js = ""
if env['firebug.logs']
js = generate_js(env['firebug.logs'])
end
if env['firebug.logs_obj']
js = generate_js(env['firebug.logs_obj'], true)
end
if orig_response.body =~ /<body>/
orig_response.each do |line|
line.gsub!("</body>", js + "\n</body>")
new_response.write(line)
end
else
new_response.write(orig_response.body + js)
end
new_response.finish
end
private
def generate_js(logs, is_json=false)
js = ["<script type=\"text/javascript\">"]
start_group(js)
logs.each do |level, log|
level = sanitise_level(level)
if is_json
js << 'console.log(eval("("+'+log+'+")"))'
else
log.gsub!('"', '\"')
js << "console.#{level.to_s}(\"#{log}\");"
end
end
end_group(js)
js << "</script>"
js.join("\n")
end
def start_group(js)
if @options[:group]
js << "console.group(\"#{@options[:group]}\");"
end
end
def sanitise_level(level)
[:info, :debug, :warn, :error].include?(level) ? level : :debug
end
def end_group(js)
if @options[:group]
js << "console.groupEnd();"
end
end
end
end

normal usage:

String

 # from a controller
 _log("test")
 # helper or something
 rails.env['firebug.logs'] = [[:notice, "test"]]

Object

(object -> whatever that implements .to_json method in Rails):

# controller
_log( { :elo => "aha!" }.to_json, true)
# view, helper etc
 rails.env['firebug.logs'] = [[:notice, {:elo => "aha!"}.to_json ]]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment