diff options
8 files changed, 125 insertions, 44 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 diff --git a/activesupport/lib/active_support/core_ext/class/inheritable_attributes.rb b/activesupport/lib/active_support/core_ext/class/inheritable_attributes.rb index c121933050..2f18666ab9 100644 --- a/activesupport/lib/active_support/core_ext/class/inheritable_attributes.rb +++ b/activesupport/lib/active_support/core_ext/class/inheritable_attributes.rb @@ -188,7 +188,7 @@ class Class # @todo We need a style for class_eval <<-HEREDOC. I'd like to make it # class_eval(<<-RUBY, __FILE__, __LINE__), but we should codify it somewhere. def extlib_inheritable_writer(*ivars) - instance_writer = ivars.pop[:instance_writer] if ivars.last.is_a?(Hash) + instance_writer = ivars.pop[:writer] if ivars.last.is_a?(Hash) ivars.each do |ivar| self.class_eval <<-RUBY, __FILE__, __LINE__ + 1 def self.#{ivar}=(obj) @@ -213,7 +213,7 @@ class Class # # @api public def extlib_inheritable_accessor(*syms) - class_inheritable_reader(*syms) - class_inheritable_writer(*syms) + extlib_inheritable_reader(*syms) + extlib_inheritable_writer(*syms) end end
\ No newline at end of file |