Is there a way to make “rake routes” look better?

2019-03-14 23:57发布

I am always forced to make my terminal window two dual monitors wide just to see read them right. I'm not a stickler for buttery GUI's, but this is bordering retarded.

Is there a pretty print for this command?

8条回答
Fickle 薄情
2楼-- · 2019-03-15 00:14

EDIT: The answer below was packaged into the html_routes gem which supports Rails 3 and 4.

The code below was made with the current Rails 3.2.3, groups by controller and looks awesome. Remember to change the <Your APP> to your app name and add gem 'syntax' to your Gemfile.

Sample image

desc 'Pretty print out all defined routes in match order, with names. Target specific controller with CONTROLLER=x.'

task :routes => :environment do
if ENV['CONTROLLER']
  all_routes = <Your APP>::Application.routes.select { |route| route.defaults[:controller] == ENV['CONTROLLER'] }
else
  all_routes = <Your APP>::Application.routes
end

convertor = Syntax::Convertors::HTML.for_syntax "ruby"

File.open(File.join(Rails.root, "routes.html"), "w") do |f|
  f.puts "<html><head><title>Your APP</title>
         <style type='text/css'>
         body { background-color: #333; color: #FFF; }
         table { border: 1px solid #777; background-color: #111; }
         td, th { font-size: 11pt; text-align: left; padding-right: 10px; }
         th { font-size: 12pt; }
         pre { maring: 0; padding: 0; }
         .contrl_head { font-size: 14pt; padding: 15px 0 5px 0; }
         .contrl_name { color: #ACE; }
         .punct { color: #99F; font-weight: bold; }
         .symbol { color: #7DD; }
         .regex { color: #F66; }
         .string { color: #F99; }4
         </style></head>
         <body>"

  last_contrl = nil

  routes = all_routes.routes.collect do |route|
    if !route.requirements.empty?
      if route.requirements[:controller] != last_contrl
        f.puts "</table>" if last_contrl
        last_contrl = route.requirements[:controller]
        f.puts "<div class='contrl_head'><b>Controller: <span class='contrl_name'>#{last_contrl}</span></b></div>" +
               "<table width='100%' border='0'><tr><th>Name</th><th>Verb</th><th>Path</th><th>Requirements</th></tr>" 
      end

      reqs = route.requirements.inspect
      verb = route.verb.source
      verb = verb[1..(verb.length-2)] if verb
      r = { :name => route.name, :verb => verb, :path => route.path, :reqs => reqs }
      f.puts "<tr><td width='12%'><b>#{r[:name]}</b></td><td width='5%'><b>#{r[:verb]}</b></td>" +
              "<td width='3%'>#{r[:path]}</td><td width='80%'>#{convertor.convert(r[:reqs])}</td></tr>"
    end
  end

  f.puts "</table></body></html>"
end
end
查看更多
该账号已被封号
3楼-- · 2019-03-15 00:21

http://localhost:3000/rails/info/routes in the browser looks a looooot better than in the terminal.

查看更多
\"骚年 ilove
4楼-- · 2019-03-15 00:23
Rails 3.1 version, Replace all <YourApp> tag with your application name.

desc 'Pretty print out all defined routes in match order, with names. Target specific controller with CONTROLLER=x.'
task :pretty_routes => :environment do
  all_routes = ENV['CONTROLLER'] ? <YourApp>::Application.routes.select { |route| route.defaults[:controller] == ENV['CONTROLLER'] } : <YourApp>::Application.routes
  routes = all_routes.routes.collect do |route|
    reqs = route.requirements.empty? ? "" : route.requirements.inspect
    {:name => route.name, :verb => route.verb, :path => route.path, :reqs => reqs}
  end
  File.open(File.join(Rails.root, "routes.html"), "w") do |f|
    f.puts "<html><head><title>Rails 3 Routes</title></head><body><table border=1>"
    f.puts "<tr><th>Name</th><th>Verb</th><th>Path</th><th>Requirements</th></tr>"
    routes.each do |r|
      f.puts "<tr><td>#{r[:name]}</td><td>#{r[:verb]}</td><td>#{r[:path]}</td><td>#{r[:reqs]}</td></tr>"
    end
    f.puts "</table></body></html>"
  end
end
查看更多
Luminary・发光体
5楼-- · 2019-03-15 00:23

For Rails 3, you can use : Rails.application.routes.routes.to_a (see my original answer)

查看更多
【Aperson】
6楼-- · 2019-03-15 00:26

You could use Sextant to print the routes in your browser: https://github.com/schneems/sextant

查看更多
ゆ 、 Hurt°
7楼-- · 2019-03-15 00:37

Great tip. Thanks.

I prepared working version for Rails 3.0. Enjoy.

desc 'Pretty print out all defined routes in match order, with names. Target specific controller with CONTROLLER=x.'

task :pretty_routes => :environment do
  all_routes = ENV['CONTROLLER'] ? ActionController::Routing::Routes.routes.select { |route| route.defaults[:controller] == ENV['CONTROLLER'] } : ActionController::Routing::Routes.routes
  routes = all_routes.collect do |route|
    reqs = route.requirements.empty? ? "" : route.requirements.inspect
    {:name => route.name, :verb => route.verb, :path => route.path, :reqs => reqs}
  end
  File.open(File.join(RAILS_ROOT, "routes.html"), "w") do |f|
    f.puts "<html><head><title>Rails 3 Routes</title></head><body><table border=1>"
    f.puts "<tr><th>Name</th><th>Verb</th><th>Path</th><th>Requirements</th></tr>"
    routes.each do |r|
      f.puts "<tr><td>#{r[:name]}</td><td>#{r[:verb]}</td><td>#{r[:path]}</td><td>#{r[:reqs]}</td></tr>"
    end
    f.puts "</table></body></html>"
  end
end
查看更多
登录 后发表回答