Permalink
Browse files

Fix generators to help with ambiguous `ApplicationController` issue

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 #6413
  • Loading branch information...
1 parent 74c4e7b commit 7c95be54b4c3f8ad2273eea39afa233f8f8b31c1 @drogus drogus committed May 20, 2012
@@ -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 }
@@ -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| -%>
@@ -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 %>
@@ -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
@@ -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/

5 comments on commit 7c95be5

Member

drogus replied May 21, 2012

I need to stop putting github specifing formatting in commit messages

Hehe, I've been doing the same with ` markers.

No! These commit messages are the best! EVER! Never ever ever stop committing like that! :D

Member

sikachu replied May 21, 2012

Agreed. A+ on the commit message. I never put github formatting in there though because I know Git can't parse markdown :P

Member

drogus replied May 21, 2012

@Holek I'm just referring to ` around constants, I should have just use indented code example. Like @sikachu noted, commits (as opposed to github issues, comments etc.) can be displayed on many other places, that will not know what to do with those chars. But anyway, thanks for nice words :D

Please sign in to comment.