From 742694e0eb1abd049aa2a4eadbc7a93591c65db4 Mon Sep 17 00:00:00 2001 From: Rick Olson Date: Fri, 26 Oct 2007 05:45:41 +0000 Subject: [PATCH] Simplfy #view_paths implementation. ActionView templates get the exact object, not a dup. [Rick] git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@8035 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- actionpack/CHANGELOG | 2 + actionpack/lib/action_controller/base.rb | 51 ++++++++++--------- actionpack/test/controller/view_paths_test.rb | 24 +++++++-- 3 files changed, 49 insertions(+), 28 deletions(-) diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG index ad32f97222..51b4135886 100644 --- a/actionpack/CHANGELOG +++ b/actionpack/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* Simplfy #view_paths implementation. ActionView templates get the exact object, not a dup. [Rick] + * Update tests for ActiveSupport's JSON escaping change. [rick] * FormHelper's auto_index should use #to_param instead of #id_before_type_cast. Closes #9994 [mattly] diff --git a/actionpack/lib/action_controller/base.rb b/actionpack/lib/action_controller/base.rb index 7ca2971236..662aa09bb6 100755 --- a/actionpack/lib/action_controller/base.rb +++ b/actionpack/lib/action_controller/base.rb @@ -408,43 +408,39 @@ def hide_action(*names) write_inheritable_attribute(:hidden_actions, hidden_actions | names.map(&:to_s)) end + ## View load paths determine the bases from which template references can be made. So a call to + ## render("test/template") will be looked up in the view load paths array and the closest match will be + ## returned. + def view_paths + @view_paths || superclass.view_paths + end - @@view_paths = {} - - # View load paths determine the bases from which template references can be made. So a call to - # render("test/template") will be looked up in the view load paths array and the closest match will be - # returned. def view_paths=(value) - @@view_paths[name] = value + @view_paths = value end - # View load paths for controller. - def view_paths - if paths = @@view_paths[name] - paths - else - if superclass.respond_to?(:view_paths) - superclass.view_paths.dup.freeze - else - @@view_paths[name] = [] - end - end - end - # Adds a view_path to the front of the view_paths array. # If the current class has no view paths, copy them from # the superclass + # + # ArticleController.prepend_view_path("views/default") + # ArticleController.prepend_view_path(["views/default", "views/custom"]) + # def prepend_view_path(path) - self.view_paths = view_paths.dup if view_paths.frozen? - view_paths.unshift(path) + @view_paths = superclass.view_paths.dup if @view_paths.nil? + view_paths.unshift(*path) end # Adds a view_path to the end of the view_paths array. # If the current class has no view paths, copy them from # the superclass + # + # ArticleController.append_view_path("views/default") + # ArticleController.append_view_path(["views/default", "views/custom"]) + # def append_view_path(path) - self.view_paths = view_paths.dup if view_paths.frozen? - view_paths << path + @view_paths = superclass.view_paths.dup if @view_paths.nil? + view_paths.push(*path) end # Replace sensitive paramater data from the request log. @@ -631,9 +627,16 @@ def session_enabled? request.session_options && request.session_options[:disabled] != false end + + self.view_paths = [] + # View load paths for controller. def view_paths - self.class.view_paths + (@template || self.class).view_paths + end + + def view_paths=(value) + (@template || self.class).view_paths = value end protected diff --git a/actionpack/test/controller/view_paths_test.rb b/actionpack/test/controller/view_paths_test.rb index 83c4ab23e7..5a6edf1db0 100644 --- a/actionpack/test/controller/view_paths_test.rb +++ b/actionpack/test/controller/view_paths_test.rb @@ -4,6 +4,8 @@ class ViewLoadPathsTest < Test::Unit::TestCase LOAD_PATH_ROOT = File.join(File.dirname(__FILE__), '..', 'fixtures') + ActionController::Base.view_paths = [ LOAD_PATH_ROOT ] + class TestController < ActionController::Base def self.controller_path() "test" end def rescue_action(e) raise end @@ -24,7 +26,7 @@ def hello_world; render(:template => 'test/hello_world'); end end def setup - TestController.view_paths = [ LOAD_PATH_ROOT ] + TestController.view_paths = nil @controller = TestController.new @request = ActionController::TestRequest.new @response = ActionController::TestResponse.new @@ -43,6 +45,22 @@ def test_template_load_path_was_set_correctly assert_equal [ LOAD_PATH_ROOT ], @controller.view_paths end + def test_template_appends_path_correctly + TestController.append_view_path 'foo' + assert_equal [LOAD_PATH_ROOT, 'foo'], @controller.view_paths + + TestController.append_view_path(%w(bar baz)) + assert_equal [LOAD_PATH_ROOT, 'foo', 'bar', 'baz'], @controller.view_paths + end + + def test_template_prepends_path_correctly + TestController.prepend_view_path 'baz' + assert_equal ['baz', LOAD_PATH_ROOT], @controller.view_paths + + TestController.prepend_view_path(%w(foo bar)) + assert_equal ['foo', 'bar', 'baz', LOAD_PATH_ROOT], @controller.view_paths + end + def test_view_paths get :hello_world assert_response :success @@ -85,11 +103,9 @@ class C < ActionController::Base; end assert_equal A.view_paths, B.view_paths assert_equal original_load_paths, C.view_paths - e = assert_raises(TypeError) { C.view_paths << 'c/path' } - assert_equal "can't modify frozen array", e.message - C.view_paths = [] assert_nothing_raised { C.view_paths << 'c/path' } + assert_equal ['c/path'], C.view_paths end end \ No newline at end of file -- GitLab