aboutsummaryrefslogtreecommitdiffstats
path: root/railties
diff options
context:
space:
mode:
authorPiotr Sarnacki <drogus@gmail.com>2010-09-26 00:17:06 +0200
committerPiotr Sarnacki <drogus@gmail.com>2010-09-30 09:47:05 +0200
commitec5d846ac6137e60d81257041e4fde82c0480b32 (patch)
tree4a0fb0b3eb176c908c68b8f01e3b3697a6522133 /railties
parent22b11a41cc764bc0f7b0c0f518a5289230428597 (diff)
downloadrails-ec5d846ac6137e60d81257041e4fde82c0480b32.tar.gz
rails-ec5d846ac6137e60d81257041e4fde82c0480b32.tar.bz2
rails-ec5d846ac6137e60d81257041e4fde82c0480b32.zip
Properly reload routes defined in class definition
Sometimes it's easier to define routes inside Engine or Application class definition (e.g. one file applications). The problem with such case is that if there is a plugin that has config/routes.rb file, it will trigger routes reload on application. Since routes definition for application is not in config/routes.rb file routes_reloader will fail to reload application's routes properly. With this commit you can pass routes definition as a block to routes method, which will allow to properly reload it: class MyApp::Application < Rails::Application routes do resources :users end end
Diffstat (limited to 'railties')
-rw-r--r--railties/lib/rails/application.rb21
-rw-r--r--railties/lib/rails/engine.rb7
-rw-r--r--railties/test/railties/engine_test.rb40
3 files changed, 62 insertions, 6 deletions
diff --git a/railties/lib/rails/application.rb b/railties/lib/rails/application.rb
index 0e85e6d1d5..2db131261c 100644
--- a/railties/lib/rails/application.rb
+++ b/railties/lib/rails/application.rb
@@ -85,13 +85,24 @@ module Rails
end
def reload_routes!
- _routes = self.routes
- _routes.disable_clear_and_finalize = true
- _routes.clear!
+ routes_to_reload.each do |_routes, draw_block|
+ _routes = self.routes
+ _routes.disable_clear_and_finalize = true
+ _routes.clear!
+ _routes.draw(&draw_block) if draw_block
+ end
routes_reloader.paths.each { |path| load(path) }
- ActiveSupport.on_load(:action_controller) { _routes.finalize! }
+ routes_to_reload.each do |_routes, draw_block|
+ ActiveSupport.on_load(:action_controller) { _routes.finalize! }
+ end
ensure
- _routes.disable_clear_and_finalize = false
+ routes_to_reload.each do |_routes, draw_block|
+ _routes.disable_clear_and_finalize = false
+ end
+ end
+
+ def routes_to_reload
+ @routes_to_reload ||= {}
end
def initialize!
diff --git a/railties/lib/rails/engine.rb b/railties/lib/rails/engine.rb
index ababf6a242..aa82a82b19 100644
--- a/railties/lib/rails/engine.rb
+++ b/railties/lib/rails/engine.rb
@@ -399,8 +399,10 @@ module Rails
}
end
- def routes
+ def routes(&block)
@routes ||= ActionDispatch::Routing::RouteSet.new
+ self.routes_draw_block = block if block_given?
+ @routes
end
def initializers
@@ -447,6 +449,7 @@ module Rails
end
initializer :add_routing_paths do |app|
+ app.routes_to_reload[self.routes] = routes_draw_block
paths.config.routes.to_a.each do |route|
app.routes_reloader.paths.unshift(route) if File.exists?(route)
end
@@ -499,6 +502,8 @@ module Rails
end
protected
+ attr_accessor :routes_draw_block
+
def find_root_with_flag(flag, default=nil)
root_path = self.class.called_from
diff --git a/railties/test/railties/engine_test.rb b/railties/test/railties/engine_test.rb
index 17bffe05e1..2b9d728b0c 100644
--- a/railties/test/railties/engine_test.rb
+++ b/railties/test/railties/engine_test.rb
@@ -663,5 +663,45 @@ module RailtiesTest
assert_equal AppTemplate._railtie, AppTemplate::Engine
end
+
+ test "properly reload routes" do
+ # when routes are inside application class definition
+ # they should not be reloaded when engine's routes
+ # file has changed
+ add_to_config <<-RUBY
+ routes do
+ mount lambda{|env| [200, {}, ["foo"]]} => "/foo"
+ mount Bukkits::Engine => "/bukkits"
+ end
+ RUBY
+
+ FileUtils.rm(File.join(app_path, "config/routes.rb"))
+
+ @plugin.write "config/routes.rb", <<-RUBY
+ Bukkits::Engine.routes.draw do
+ mount lambda{|env| [200, {}, ["bar"]]} => "/bar"
+ end
+ RUBY
+
+ @plugin.write "lib/bukkits.rb", <<-RUBY
+ module Bukkits
+ class Engine < ::Rails::Engine
+ namespace(Bukkits)
+ end
+ end
+ RUBY
+
+ require 'rack/test'
+ extend Rack::Test::Methods
+
+ boot_rails
+
+ require "#{rails_root}/config/environment"
+ get "/foo"
+ assert_equal "foo", last_response.body
+
+ get "/bukkits/bar"
+ assert_equal "bar", last_response.body
+ end
end
end