Перечисление 'граблей-маршрутов' для монтируемого движка 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