Перечисление 'граблей-маршрутов' для монтируемого движка Rails 3.1

Я работаю над монтируемым движком для использования с Rails 3.1 и хочу перечислить маршруты движка.

Я создал двигатель, используя:

$ rails plugin new rails_blog_engine --mountable

И отредактировал файл 'test/dummy/config/routs', чтобы прочитать:

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

... и "config / маршруты" читать:

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

Я хочу перечислить маршруты, сгенерированные для ': posts', но не ясно, как я могу это сделать. Когда я запускаю 'rake app: маршруты', я получаю только маршрут "/blog":

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

Когда я запускаю "Рейк-маршруты", я получаю сообщение об ошибке:

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

Как я могу увидеть маршруты для ':posts'? Могу ли я сделать это без переписывания соответствующих задач рейка?

6 ответов

Решение

Если вы копируете код из стандартной задачи Rails 3.1.0 rake routs в ваш Rakefile, и измените верхнюю часть следующим образом:

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

... заменив RailsBlogEngine именем вашего движка, вы можете получить элементарный список маршрутов, выполнив:

rake routes

Обратите внимание, что в Rails 3.1.1 и более поздних версиях вам понадобится более новая версия задачи по рейку.

В случае, если люди упускают его в комментариях, по состоянию на Rails 3.2.2Теперь вы можете использовать

$ rake app:routes

Для рельсов 3.x двигателя, rake routes не работает под рутом движка (поэтому нужно взломать, скопировав файл rake). тем не мение rake routes работает под тестом / пустышкой (или спецификацией / пустышкой при использовании rspec). В нем будут перечислены все схемы, которые относятся к разрабатываемому двигателю и другим установленным двигателям.

Для рельсов 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

Рельсы 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

Тогда вы можете позвонить как

 $rake engine_routes ENGINE="IssueTracker::Engine"

В Rails 5 я мог получить маршруты двигателя, используя следующую команду:

bundle exec rake app:routes

В rails 3.2X Если вы используете host_app и смонтировали движок, вы, вероятно, могли бы составить список маршрутов, выполнив (должно работать из коробки):

bundle exec rake engine_name:routes
Другие вопросы по тегам