简体   繁体   中英

Listing 'rake routes' for a mountable Rails 3.1 engine

I'm working on a mountable engine for use with Rails 3.1, and I want to list the engine's routes.

I created the engine using:

$ rails plugin new rails_blog_engine --mountable

And edited the 'test/dummy/config/routes' file to read:

Rails.application.routes.draw do
  mount RailsBlogEngine::Engine => "/blog"
end

...and 'config/routes' to read:

RailsBlogEngine::Engine.routes.draw do
  resources :posts
end

I want to list the routes generated for ':posts', but it's not clear how I can do this. When I run 'rake app:routes', I get only the "/blog" route:

$ rake app:routes
rails_blog_engine    /blog    {:to=>RailsBlogEngine::Engine}

When I run 'rake routes', I get an error:

$ rake routes
rake aborted!
Don't know how to build task 'routes'

How can I see the routes for ':posts'? Can I do this without rewriting the relevant rake tasks?

如果人们在评论中遗漏了它,从Rails 3.2.2 ,您现在可以使用

$ rake app:routes

If you copy code from the standard Rails 3.1.0 rake routes task into your Rakefile, and change the top part to read:

task :routes => 'app:environment' do
  Rails.application.reload_routes!
  all_routes = RailsBlogEngine::Engine.routes.routes

...replacing RailsBlogEngine with the name of your engine, then you can get a rudimentary list of routes by running:

rake routes

Note that in Rails 3.1.1 and later, you'll need a newer version of the rake routes task.

For rails 3.x engine, rake routes does not work under engine's root (that's why it needs some hack by copying rake file). However rake routes works under test/dummy (or spec/dummy if using rspec). It will list all the pathes which belong to the engine in development and other engines mounted.

For rails 3

 desc 'Print out all defined routes inside engine  match order, with names. Target specific controller with CONTROLLER=x.'
  task engine_routes: :environment do
    Rails.application.reload_routes!
    app = ENV['ENGINE'] || "Rails.application"
    all_routes = app.constantize.routes.routes
    require 'rails/application/route_inspector'
    inspector = Rails::Application::RouteInspector.new
    puts inspector.format(all_routes, ENV['CONTROLLER']).join "\n"
  end

Rails 4

 desc 'Print out all defined routes inside engine match order, with names. Target specific controller with CONTROLLER=x.'

  task engine_routes: :environment do
   app = ENV['ENGINE'] || "Rails.application"
   all_routes = app.constantize.routes.routes
   require 'action_dispatch/routing/inspector'
   inspector = ActionDispatch::Routing::RoutesInspector.new(all_routes)
   puts inspector.format(ActionDispatch::Routing::ConsoleFormatter.new, ENV['CONTROLLER'])
  end

Then you can call like

 $rake engine_routes ENGINE="IssueTracker::Engine"

在Rails 5中,我可以使用以下命令获取引擎的路由:

bundle exec rake app:routes

在rails 3.2X中如果您在“host_app”并安装了引擎,您可以通过执行列出路径(应该开箱即用):

bundle exec rake engine_name:routes

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM