Skip to content

Commit

Permalink
Merge pull request #41463 from jhawthorn/isolated_engine_controller_s…
Browse files Browse the repository at this point in the history
…ubclasses

Re-define _routes when not set correctly via inheritance
  • Loading branch information
jhawthorn committed Feb 16, 2021
1 parent 4f5e6b5 commit e322277
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 2 deletions.
18 changes: 17 additions & 1 deletion actionpack/lib/abstract_controller/railties/routes_helpers.rb
Expand Up @@ -7,11 +7,27 @@ def self.with(routes, include_path_helpers = true)
Module.new do
define_method(:inherited) do |klass|
super(klass)
if namespace = klass.module_parents.detect { |m| m.respond_to?(:railtie_routes_url_helpers) }

namespace = klass.module_parents.detect { |m| m.respond_to?(:railtie_routes_url_helpers) }
actual_routes = namespace ? namespace.railtie_routes_url_helpers._routes : routes

if namespace
klass.include(namespace.railtie_routes_url_helpers(include_path_helpers))
else
klass.include(routes.url_helpers(include_path_helpers))
end

# In the case that we have ex.
# class A::Foo < ApplicationController
# class Bar < A::Foo
# We will need to redefine _routes because it will not be correct
# via inheritance.
unless klass._routes.equal?(actual_routes)
klass.redefine_singleton_method(:_routes) { actual_routes }
klass.include(Module.new do
define_method(:_routes) { @_routes || actual_routes }
end)
end
end
end
end
Expand Down
29 changes: 28 additions & 1 deletion railties/test/railties/engine_test.rb
Expand Up @@ -644,7 +644,7 @@ class Engine < ::Rails::Engine
assert_equal Rails.application.routes, env["action_dispatch.routes"]
end

test "isolated engine should include only its own routes and helpers" do
test "isolated engine routes and helpers are isolated to that engine" do
@plugin.write "lib/bukkits.rb", <<-RUBY
module Bukkits
class Engine < ::Rails::Engine
Expand Down Expand Up @@ -729,6 +729,30 @@ def polymorphic_path_without_namespace
end
RUBY

@plugin.write "app/controllers/bukkits/session_controller.rb", <<-RUBY
module Bukkits
class SessionController < ApplicationController
def index
render plain: default_path
end
private
def default_path
foo_path
end
end
end
RUBY

controller "bar", <<-RUBY
class BarController < Bukkits::SessionController
private
def default_path
bar_path
end
end
RUBY

@plugin.write "app/mailers/bukkits/my_mailer.rb", <<-RUBY
module Bukkits
class MyMailer < ActionMailer::Base
Expand All @@ -746,6 +770,9 @@ class MyMailer < ActionMailer::Base
assert ::Bukkits::MyMailer.method_defined?(:foo_url)
assert_not ::Bukkits::MyMailer.method_defined?(:bar_url)

get("/bar")
assert_equal "/bar", last_response.body

get("/bukkits/from_app")
assert_equal "false", last_response.body

Expand Down

0 comments on commit e322277

Please sign in to comment.