aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack
diff options
context:
space:
mode:
Diffstat (limited to 'actionpack')
-rw-r--r--actionpack/lib/action_controller/abstract/base.rb3
-rw-r--r--actionpack/lib/action_controller/abstract/helpers.rb55
-rw-r--r--actionpack/test/abstract_controller/abstract_controller_test.rb21
-rw-r--r--actionpack/test/abstract_controller/callbacks_test.rb22
-rw-r--r--actionpack/test/abstract_controller/helper_test.rb39
-rw-r--r--actionpack/test/abstract_controller/test_helper.rb22
-rw-r--r--actionpack/test/abstract_controller/views/helper_test.erb1
7 files changed, 122 insertions, 41 deletions
diff --git a/actionpack/lib/action_controller/abstract/base.rb b/actionpack/lib/action_controller/abstract/base.rb
index fe84c0f479..fa86d68c04 100644
--- a/actionpack/lib/action_controller/abstract/base.rb
+++ b/actionpack/lib/action_controller/abstract/base.rb
@@ -9,6 +9,9 @@ module AbstractController
new.process(action)
end
+ def self.inherited(klass)
+ end
+
def initialize
self.response_obj = {}
end
diff --git a/actionpack/lib/action_controller/abstract/helpers.rb b/actionpack/lib/action_controller/abstract/helpers.rb
new file mode 100644
index 0000000000..b942a7ea80
--- /dev/null
+++ b/actionpack/lib/action_controller/abstract/helpers.rb
@@ -0,0 +1,55 @@
+module AbstractController
+ module Helpers
+
+ def self.included(klass)
+ klass.class_eval do
+ extend ClassMethods
+ unless self < ::AbstractController::Renderer
+ raise "You need to include AbstractController::Renderer before including " \
+ "AbstractController::Helpers"
+ end
+ extlib_inheritable_accessor :master_helper_module
+ self.master_helper_module = Module.new
+ end
+ end
+
+ def _action_view
+ av = super
+ av.helpers.send(:include, master_helper_module)
+ end
+
+ module ClassMethods
+ def inherited(klass)
+ klass.master_helper_module = Module.new
+ klass.master_helper_module.__send__ :include, master_helper_module
+
+ super
+ end
+
+ def add_template_helper(mod)
+ master_helper_module.module_eval { include mod }
+ end
+
+ def helper_method(*meths)
+ meths.flatten.each do |meth|
+ master_helper_module.class_eval <<-ruby_eval, __FILE__, __LINE__ + 1
+ def #{meth}(*args, &blk)
+ controller.send(%(#{meth}), *args, &blk)
+ end
+ ruby_eval
+ end
+ end
+
+ def helper(*args, &blk)
+ args.flatten.each do |arg|
+ case arg
+ when Module
+ add_template_helper(arg)
+ end
+ end
+ master_helper_module.module_eval(&blk) if block_given?
+ end
+ end
+
+ end
+end \ No newline at end of file
diff --git a/actionpack/test/abstract_controller/abstract_controller_test.rb b/actionpack/test/abstract_controller/abstract_controller_test.rb
index 4834f8b7bb..7b0caa3837 100644
--- a/actionpack/test/abstract_controller/abstract_controller_test.rb
+++ b/actionpack/test/abstract_controller/abstract_controller_test.rb
@@ -1,23 +1,4 @@
-$:.unshift(File.dirname(__FILE__) + '/../../lib')
-$:.unshift(File.dirname(__FILE__) + '/../../../activesupport/lib')
-
-require 'test/unit'
-require 'active_support'
-require 'active_support/test_case'
-require 'action_controller'
-require 'action_view/base'
-
-begin
- require 'ruby-debug'
- Debugger.settings[:autoeval] = true
- Debugger.start
-rescue LoadError
- # Debugging disabled. `gem install ruby-debug` to enable.
-end
-
-require 'action_controller/abstract/base'
-require 'action_controller/abstract/renderer'
-require 'action_controller/abstract/layouts'
+require File.join(File.expand_path(File.dirname(__FILE__)), "test_helper")
module AbstractController
module Testing
diff --git a/actionpack/test/abstract_controller/callbacks_test.rb b/actionpack/test/abstract_controller/callbacks_test.rb
index 2657a31ca9..89243b631e 100644
--- a/actionpack/test/abstract_controller/callbacks_test.rb
+++ b/actionpack/test/abstract_controller/callbacks_test.rb
@@ -1,24 +1,4 @@
-$:.unshift(File.dirname(__FILE__) + '/../../lib')
-$:.unshift(File.dirname(__FILE__) + '/../../../activesupport/lib')
-
-require 'test/unit'
-require 'active_support'
-require 'active_support/test_case'
-require 'action_controller'
-require 'action_view/base'
-
-begin
- require 'ruby-debug'
- Debugger.settings[:autoeval] = true
- Debugger.start
-rescue LoadError
- # Debugging disabled. `gem install ruby-debug` to enable.
-end
-
-require 'action_controller/abstract/base'
-require 'action_controller/abstract/renderer'
-require 'action_controller/abstract/layouts'
-require 'action_controller/abstract/callbacks'
+require File.join(File.expand_path(File.dirname(__FILE__)), "test_helper")
module AbstractController
module Testing
diff --git a/actionpack/test/abstract_controller/helper_test.rb b/actionpack/test/abstract_controller/helper_test.rb
new file mode 100644
index 0000000000..81dbee3065
--- /dev/null
+++ b/actionpack/test/abstract_controller/helper_test.rb
@@ -0,0 +1,39 @@
+require File.join(File.expand_path(File.dirname(__FILE__)), "test_helper")
+
+module AbstractController
+ module Testing
+
+ class ControllerWithHelpers < AbstractController::Base
+ include Renderer
+ include Helpers
+
+ append_view_path File.expand_path(File.join(File.dirname(__FILE__), "views"))
+ end
+
+ module HelperyTest
+ def included_method
+ "Included"
+ end
+ end
+
+ class MyHelpers1 < ControllerWithHelpers
+ helper(HelperyTest) do
+ def helpery_test
+ "World"
+ end
+ end
+
+ def index
+ render "helper_test.erb"
+ end
+ end
+
+ class TestHelpers < ActiveSupport::TestCase
+ def test_helpers
+ result = MyHelpers1.process(:index)
+ assert_equal "Hello World : Included", result.response_obj[:body]
+ end
+ end
+
+ end
+end \ No newline at end of file
diff --git a/actionpack/test/abstract_controller/test_helper.rb b/actionpack/test/abstract_controller/test_helper.rb
new file mode 100644
index 0000000000..9f94baea35
--- /dev/null
+++ b/actionpack/test/abstract_controller/test_helper.rb
@@ -0,0 +1,22 @@
+$:.unshift(File.dirname(__FILE__) + '/../../lib')
+$:.unshift(File.dirname(__FILE__) + '/../../../activesupport/lib')
+
+require 'test/unit'
+require 'active_support'
+require 'active_support/test_case'
+require 'action_controller'
+require 'action_view/base'
+
+begin
+ require 'ruby-debug'
+ Debugger.settings[:autoeval] = true
+ Debugger.start
+rescue LoadError
+ # Debugging disabled. `gem install ruby-debug` to enable.
+end
+
+require 'action_controller/abstract/base'
+require 'action_controller/abstract/renderer'
+require 'action_controller/abstract/layouts'
+require 'action_controller/abstract/callbacks'
+require 'action_controller/abstract/helpers' \ No newline at end of file
diff --git a/actionpack/test/abstract_controller/views/helper_test.erb b/actionpack/test/abstract_controller/views/helper_test.erb
new file mode 100644
index 0000000000..8ae45cc195
--- /dev/null
+++ b/actionpack/test/abstract_controller/views/helper_test.erb
@@ -0,0 +1 @@
+Hello <%= helpery_test %> : <%= included_method %> \ No newline at end of file