diff options
-rw-r--r-- | actionpack/lib/action_controller/railties/paths.rb | 12 | ||||
-rw-r--r-- | railties/lib/rails/engine.rb | 18 | ||||
-rw-r--r-- | railties/lib/rails/engine/configuration.rb | 1 | ||||
-rw-r--r-- | railties/test/railties/engine_test.rb | 19 |
4 files changed, 38 insertions, 12 deletions
diff --git a/actionpack/lib/action_controller/railties/paths.rb b/actionpack/lib/action_controller/railties/paths.rb index 81d03f5e73..e1b318b566 100644 --- a/actionpack/lib/action_controller/railties/paths.rb +++ b/actionpack/lib/action_controller/railties/paths.rb @@ -1,22 +1,16 @@ module ActionController module Railties module Paths - def self.with(_app) + def self.with(app) Module.new do define_method(:inherited) do |klass| super(klass) if namespace = klass.parents.detect {|m| m.respond_to?(:_railtie) } - app = namespace._railtie + klass.helpers_path = namespace._railtie.config.paths.app.helpers.to_a else - app = _app + klass.helpers_path = app.config.helpers_paths end - paths = app.config.paths - options = app.config.action_controller - - options.helpers_path ||= paths.app.helpers.to_a - options.each { |k,v| klass.send("#{k}=", v) } - klass.helper :all end end diff --git a/railties/lib/rails/engine.rb b/railties/lib/rails/engine.rb index 3d4bbca5d7..bc3014adaa 100644 --- a/railties/lib/rails/engine.rb +++ b/railties/lib/rails/engine.rb @@ -242,7 +242,7 @@ module Rails autoload :Configuration, "rails/engine/configuration" class << self - attr_accessor :called_from + attr_accessor :called_from, :namespaced alias :engine_name :railtie_name def inherited(base) @@ -292,11 +292,17 @@ module Rails "#{name}_" end end + + self.namespaced = true + end + + def namespaced? + !!namespaced end end delegate :middleware, :root, :paths, :to => :config - delegate :engine_name, :to => "self.class" + delegate :engine_name, :namespaced?, :to => "self.class" def load_tasks super @@ -435,6 +441,14 @@ module Rails config.static_asset_paths[config.compiled_asset_path] = public_path end end + + initializer :prepend_helpers_path do + unless namespaced? + config.helpers_paths = [] unless config.respond_to?(:helpers_paths) + config.helpers_paths = config.paths.app.helpers.to_a + config.helpers_paths + end + end + protected def find_root_with_flag(flag, default=nil) root_path = self.class.called_from diff --git a/railties/lib/rails/engine/configuration.rb b/railties/lib/rails/engine/configuration.rb index bce1cd6580..3ac8911ba8 100644 --- a/railties/lib/rails/engine/configuration.rb +++ b/railties/lib/rails/engine/configuration.rb @@ -11,6 +11,7 @@ module Rails super() @root = root @middleware = Rails::Configuration::MiddlewareStackProxy.new + @helpers_paths = [] end def paths diff --git a/railties/test/railties/engine_test.rb b/railties/test/railties/engine_test.rb index fff925404d..6deca9cf1e 100644 --- a/railties/test/railties/engine_test.rb +++ b/railties/test/railties/engine_test.rb @@ -304,11 +304,12 @@ module RailtiesTest assert_equal response[2].path, File.join(app_path, "public/bukkits/file_from_app.html") end - test "shared engine should include application's helpers" do + test "shared engine should include application's helpers and own helpers" do app_file "config/routes.rb", <<-RUBY AppTemplate::Application.routes.draw do match "/foo" => "bukkits/foo#index", :as => "foo" match "/foo/show" => "bukkits/foo#show" + match "/foo/bar" => "bukkits/foo#bar" end RUBY @@ -320,6 +321,14 @@ module RailtiesTest end RUBY + @plugin.write "app/helpers/bar_helper.rb", <<-RUBY + module BarHelper + def bar + "It's a bar." + end + end + RUBY + @plugin.write "app/controllers/bukkits/foo_controller.rb", <<-RUBY class Bukkits::FooController < ActionController::Base def index @@ -329,6 +338,10 @@ module RailtiesTest def show render :text => foo_path end + + def bar + render :inline => "<%= bar %>" + end end RUBY @@ -341,6 +354,10 @@ module RailtiesTest env = Rack::MockRequest.env_for("/foo/show") response = Rails.application.call(env) assert_equal "/foo", response[2].body + + env = Rack::MockRequest.env_for("/foo/bar") + response = Rails.application.call(env) + assert_equal "It's a bar.", response[2].body end test "namespaced engine should include only its own routes and helpers" do |