aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--actionpack/lib/action_controller/railties/paths.rb12
-rw-r--r--railties/lib/rails/engine.rb18
-rw-r--r--railties/lib/rails/engine/configuration.rb1
-rw-r--r--railties/test/railties/engine_test.rb19
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