diff --git a/actionpack/CHANGELOG.md b/actionpack/CHANGELOG.md index bdccfb9805170..ab38408868e9f 100644 --- a/actionpack/CHANGELOG.md +++ b/actionpack/CHANGELOG.md @@ -1,3 +1,12 @@ +* Fix `Rails.application.reload_routes!` from clearing almost all routes. + + When calling `Rails.application.reload_routes!` inside a middleware of + a Rake task, it was possible under certain conditions that all routes would be cleared. + If ran inside a middleware, this would result in getting a 404 on most page you visit. + This issue was only happening in development. + + *Edouard Chin* + * Add resource name to the `ArgumentError` that's raised when invalid `:only` or `:except` options are given to `#resource` or `#resources` This makes it easier to locate the source of the problem, especially for routes drawn by gems. diff --git a/railties/lib/rails/application.rb b/railties/lib/rails/application.rb index 1396613d52310..b79b41e844459 100644 --- a/railties/lib/rails/application.rb +++ b/railties/lib/rails/application.rb @@ -156,7 +156,7 @@ def run_load_hooks! # :nodoc: # Reload application routes regardless if they changed or not. def reload_routes! - routes_reloader.reload! + routes_reloader.execute_unless_loaded || routes_reloader.reload! end def reload_routes_unless_loaded # :nodoc: diff --git a/railties/test/application/rake_test.rb b/railties/test/application/rake_test.rb index 75e33bd274ce6..cecc04955473f 100644 --- a/railties/test/application/rake_test.rb +++ b/railties/test/application/rake_test.rb @@ -185,6 +185,26 @@ def test_code_statistics assert_match(/Code LOC: \d+\s+Test LOC: \d+\s+ Code to Test Ratio: 1:\w+/, rails("stats")) end + def test_reload_routes + add_to_config <<-RUBY + rake_tasks do + task do_something: :environment do + Rails.application.reload_routes! + puts Rails.application.routes.named_routes.to_h.keys.join(" ") + end + end + RUBY + + app_file "config/routes.rb", <<-RUBY + Rails.application.routes.draw do + get "foo", to: "foo#bar", as: :my_great_route + end + RUBY + + output = Dir.chdir(app_path) { `bin/rails do_something` } + assert_includes(output.lines.first, "my_great_route") + end + def test_loading_specific_fixtures rails "generate", "model", "user", "username:string", "password:string" rails "generate", "model", "product", "name:string"