Skip to content

Commit

Permalink
Fix generators to help with ambiguous ApplicationController issue
Browse files Browse the repository at this point in the history
In development mode, dependencies are loaded dynamically at runtime,
using `const_missing`. Because of that, when one of the constants is
already loaded and `const_missing` is not triggered, user can end up
with unexpected results.

Given such file in an Engine:

```ruby
module Blog
  class PostsController < ApplicationController
  end
end
```

If you load it first, before loading any application files, it will
correctly load `Blog::ApplicationController`, because second line will
hit `const_missing`. However if you load `ApplicationController` first,
the constant will be loaded already, `const_missing` hook will not be
fired and in result `PostsController` will inherit from
`ApplicationController` instead of `Blog::ApplicationController`.

Since it can't be fixed in `AS::Dependencies`, the easiest fix is to
just explicitly load application controller.

closes rails#6413
  • Loading branch information
drogus committed May 20, 2012
1 parent 74c4e7b commit 7c95be5
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 5 deletions.
4 changes: 4 additions & 0 deletions railties/lib/rails/generators/named_base.rb
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,10 @@ def regular_class_path
@class_path
end

def namespaced_file_path
@namespaced_file_path ||= namespaced_class_path.join("/")
end

def namespaced_class_path
@namespaced_class_path ||= begin
namespace_path = namespace.name.split("::").map {|m| m.underscore }
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
<% if namespaced? -%>
require "<%= namespaced_file_path %>/application_controller"
<% end -%>
<% module_namespacing do -%>
class <%= class_name %>Controller < ApplicationController
<% actions.each do |action| -%>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
<% if namespaced? -%>
require "<%= namespaced_file_path %>/application_controller"
<% end -%>
<% module_namespacing do -%>
class <%= controller_class_name %>Controller < ApplicationController
# GET <%= route_url %>
Expand Down
17 changes: 12 additions & 5 deletions railties/test/generators/namespaced_generators_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,14 @@ class NamespacedControllerGeneratorTest < NamespacedGeneratorTestCase

def test_namespaced_controller_skeleton_is_created
run_generator
assert_file "app/controllers/test_app/account_controller.rb", /module TestApp/, / class AccountController < ApplicationController/
assert_file "test/functional/test_app/account_controller_test.rb", /module TestApp/, / class AccountControllerTest/
assert_file "app/controllers/test_app/account_controller.rb",
/require "test_app\/application_controller"/,
/module TestApp/,
/ class AccountController < ApplicationController/

assert_file "test/functional/test_app/account_controller_test.rb",
/module TestApp/,
/ class AccountControllerTest/
end

def test_skipping_namespace
Expand Down Expand Up @@ -227,9 +233,10 @@ def test_scaffold_on_invoke
end

# Controller
assert_file "app/controllers/test_app/product_lines_controller.rb" do |content|
assert_match(/module TestApp\n class ProductLinesController < ApplicationController/, content)
end
assert_file "app/controllers/test_app/product_lines_controller.rb",
/require "test_app\/application_controller"/,
/module TestApp/,
/class ProductLinesController < ApplicationController/

assert_file "test/functional/test_app/product_lines_controller_test.rb",
/module TestApp\n class ProductLinesControllerTest < ActionController::TestCase/
Expand Down

0 comments on commit 7c95be5

Please sign in to comment.