aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRick Olson <technoweenie@gmail.com>2007-02-04 20:47:05 +0000
committerRick Olson <technoweenie@gmail.com>2007-02-04 20:47:05 +0000
commit69b0e5c44a05fddcac996c7aaaca61cb3188da5e (patch)
tree4e5da68ffe3eac5561a9101a451a2f56a701e989
parent8f614a80e725228c0cc0c03fd731c6cbad0ffcb7 (diff)
downloadrails-69b0e5c44a05fddcac996c7aaaca61cb3188da5e.tar.gz
rails-69b0e5c44a05fddcac996c7aaaca61cb3188da5e.tar.bz2
rails-69b0e5c44a05fddcac996c7aaaca61cb3188da5e.zip
Allow Controllers to have multiple view_paths instead of a single template_root. Closes #2754 [John Long]
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@6120 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
-rw-r--r--actionpack/CHANGELOG2
-rwxr-xr-xactionpack/README2
-rw-r--r--actionpack/examples/address_book_controller.rb2
-rw-r--r--actionpack/examples/benchmark.rb2
-rwxr-xr-xactionpack/examples/blog_controller.cgi2
-rwxr-xr-xactionpack/examples/debate_controller.cgi2
-rwxr-xr-xactionpack/lib/action_controller/base.rb58
-rw-r--r--actionpack/lib/action_controller/layout.rb19
-rw-r--r--actionpack/lib/action_view/base.rb32
-rw-r--r--actionpack/test/activerecord/pagination_test.rb2
-rw-r--r--actionpack/test/controller/action_pack_assertions_test.rb2
-rw-r--r--actionpack/test/controller/addresses_render_test.rb2
-rw-r--r--actionpack/test/controller/capture_test.rb2
-rw-r--r--actionpack/test/controller/content_type_test.rb2
-rw-r--r--actionpack/test/controller/deprecation/deprecated_base_methods_test.rb2
-rw-r--r--actionpack/test/controller/layout_test.rb12
-rw-r--r--actionpack/test/controller/mime_responds_test.rb2
-rw-r--r--actionpack/test/controller/new_render_test.rb4
-rw-r--r--actionpack/test/controller/render_test.rb4
-rw-r--r--actionpack/test/controller/send_file_test.rb2
-rw-r--r--actionpack/test/controller/view_paths_test.rb78
-rw-r--r--actionpack/test/fixtures/override/test/hello_world.rhtml1
-rw-r--r--actionpack/test/template/deprecated_instance_variables_test.rb2
-rw-r--r--actionpack/test/template/url_helper_test.rb4
24 files changed, 183 insertions, 59 deletions
diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG
index c07c5165bd..af521f33a7 100644
--- a/actionpack/CHANGELOG
+++ b/actionpack/CHANGELOG
@@ -1,5 +1,7 @@
*SVN*
+* Allow Controllers to have multiple view_paths instead of a single template_root. Closes #2754 [John Long]
+
* Add much-needed html-scanner tests. Fixed CDATA parsing bug. [Rick]
* improve error message for Routing for named routes. Closes #7346 [Rob Sanheim]
diff --git a/actionpack/README b/actionpack/README
index a700742c04..de50e28177 100755
--- a/actionpack/README
+++ b/actionpack/README
@@ -382,7 +382,7 @@ methods:
end
end
- WeblogController::Base.template_root = File.dirname(__FILE__)
+ WeblogController::Base.view_paths = [ File.dirname(__FILE__) ]
WeblogController.process_cgi if $0 == __FILE__
The last two lines are responsible for telling ActionController where the
diff --git a/actionpack/examples/address_book_controller.rb b/actionpack/examples/address_book_controller.rb
index 9ca6612512..7042ad84a5 100644
--- a/actionpack/examples/address_book_controller.rb
+++ b/actionpack/examples/address_book_controller.rb
@@ -42,7 +42,7 @@ class AddressBookController < ActionController::Base
end
end
-ActionController::Base.template_root = File.dirname(__FILE__)
+ActionController::Base.view_paths = [ File.dirname(__FILE__) ]
# ActionController::Base.logger = Logger.new("debug.log") # Remove first comment to turn on logging in current dir
begin
diff --git a/actionpack/examples/benchmark.rb b/actionpack/examples/benchmark.rb
index 1e10a0c962..21d81283a6 100644
--- a/actionpack/examples/benchmark.rb
+++ b/actionpack/examples/benchmark.rb
@@ -24,7 +24,7 @@ class BenchmarkController < ActionController::Base
end
end
-#ActionController::Base.template_root = File.dirname(__FILE__)
+#ActionController::Base.view_paths = [ File.dirname(__FILE__) ]
require "benchmark"
diff --git a/actionpack/examples/blog_controller.cgi b/actionpack/examples/blog_controller.cgi
index 3868c306df..506afad62f 100755
--- a/actionpack/examples/blog_controller.cgi
+++ b/actionpack/examples/blog_controller.cgi
@@ -43,7 +43,7 @@ class BlogController < ActionController::Base
end
end
-ActionController::Base.template_root = File.dirname(__FILE__)
+ActionController::Base.view_paths = [ File.dirname(__FILE__) ]
# ActionController::Base.logger = Logger.new("debug.log") # Remove first comment to turn on logging in current dir
begin
diff --git a/actionpack/examples/debate_controller.cgi b/actionpack/examples/debate_controller.cgi
index dbe022568b..9cb787940c 100755
--- a/actionpack/examples/debate_controller.cgi
+++ b/actionpack/examples/debate_controller.cgi
@@ -47,7 +47,7 @@ class DebateController < ActionController::Base
end
end
-ActionController::Base.template_root = File.dirname(__FILE__)
+ActionController::Base.view_paths = [ File.dirname(__FILE__) ]
# ActionController::Base.logger = Logger.new("debug.log") # Remove first comment to turn on logging in current dir
begin
diff --git a/actionpack/lib/action_controller/base.rb b/actionpack/lib/action_controller/base.rb
index 8a3cb3eec3..62dba3bc43 100755
--- a/actionpack/lib/action_controller/base.rb
+++ b/actionpack/lib/action_controller/base.rb
@@ -277,11 +277,7 @@ module ActionController #:nodoc:
# Controls the default charset for all renders.
@@default_charset = "utf-8"
cattr_accessor :default_charset
-
- # Template root determines the base from which template references will be made. So a call to render("test/template")
- # will be converted to "#{template_root}/test/template.rhtml".
- class_inheritable_accessor :template_root
-
+
# The logger is used for generating information on the action run-time (including benchmarking) if available.
# Can be set to nil for no logging. Compatible with both Ruby's own Logger and Log4r loggers.
cattr_accessor :logger
@@ -357,7 +353,41 @@ module ActionController #:nodoc:
def hide_action(*names)
write_inheritable_attribute(:hidden_actions, hidden_actions | names.collect { |n| n.to_s })
end
-
+
+ # Deprecated. Use view_paths instead.
+ def template_root=(path)
+ view_paths.unshift(path)
+ end
+ deprecate :template_root= => :view_paths
+
+ # Deprecated. Use view_paths instead.
+ def template_root
+ view_paths.first
+ end
+ deprecate :template_root => :view_paths
+
+ @@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
+ 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
+
# Replace sensitive paramater data from the request log.
# Filters paramaters that have any of the arguments as a substring.
# Looks in all subhashes of the param hash for keys to filter.
@@ -534,10 +564,15 @@ module ActionController #:nodoc:
def controller_path
self.class.controller_path
end
-
+
def session_enabled?
request.session_options[:disabled] != false
end
+
+ # View load paths for controller.
+ def view_paths
+ self.class.view_paths
+ end
protected
# Renders the content that will be returned to the browser as the response body.
@@ -1030,14 +1065,10 @@ module ActionController #:nodoc:
end
end
- def self.view_root
- @view_root ||= template_root
- end
-
def initialize_template_class(response)
raise "You must assign a template class through ActionController.template_class= before processing a request" unless @@template_class
- response.template = self.class.view_class.new(self.class.view_root, {}, self)
+ response.template = self.class.view_class.new(view_paths, {}, self)
response.redirected_to = nil
@performed_render = @performed_redirect = false
end
@@ -1057,7 +1088,6 @@ module ActionController #:nodoc:
assign_deprecated_shortcuts(request, response)
end
-
# TODO: assigns cookies headers params request response template
DEPRECATED_INSTANCE_VARIABLES = %w(cookies flash headers params request response session)
@@ -1151,7 +1181,7 @@ module ActionController #:nodoc:
end
def add_class_variables_to_assigns
- %w(template_root logger template_class ignore_missing_templates).each do |cvar|
+ %w(view_paths logger template_class ignore_missing_templates).each do |cvar|
@assigns[cvar] = self.send(cvar)
end
end
diff --git a/actionpack/lib/action_controller/layout.rb b/actionpack/lib/action_controller/layout.rb
index 82c7180a52..6eaf8bb31f 100644
--- a/actionpack/lib/action_controller/layout.rb
+++ b/actionpack/lib/action_controller/layout.rb
@@ -179,16 +179,18 @@ module ActionController #:nodoc:
def default_layout #:nodoc:
@default_layout ||= read_inheritable_attribute("layout")
end
-
+
+ def layout_list #:nodoc:
+ view_paths.collect do |path|
+ Dir["#{path}/layouts/**/*"]
+ end.flatten
+ end
+
private
def inherited_with_layout(child)
inherited_without_layout(child)
layout_match = child.name.underscore.sub(/_controller$/, '').sub(/^controllers\//, '')
- child.layout(layout_match) unless layout_list.grep(%r{layouts/#{layout_match}\.[a-z][0-9a-z]*$}).empty?
- end
-
- def layout_list
- Dir.glob("#{template_root}/layouts/**/*")
+ child.layout(layout_match) unless child.layout_list.grep(%r{layouts/#{layout_match}\.[a-z][0-9a-z]*$}).empty?
end
def add_layout_conditions(conditions)
@@ -305,7 +307,10 @@ module ActionController #:nodoc:
# Does a layout directory for this class exist?
# we cache this info in a class level hash
def layout_directory?(layout_name)
- template_path = File.join(self.class.view_root, 'layouts', layout_name)
+ view_paths.find do |path|
+ File.file?(File.join(path, 'layouts', layout_name))
+ end
+ template_path ||= File.join(view_paths.first, 'layouts', layout_name)
dirname = File.dirname(template_path)
self.class.send(:layout_directory_exists_cache)[dirname]
end
diff --git a/actionpack/lib/action_view/base.rb b/actionpack/lib/action_view/base.rb
index 303a946186..d8bb6add34 100644
--- a/actionpack/lib/action_view/base.rb
+++ b/actionpack/lib/action_view/base.rb
@@ -232,15 +232,16 @@ module ActionView #:nodoc:
@@template_handlers[extension] = klass
end
- def initialize(base_path = nil, assigns_for_first_render = {}, controller = nil)#:nodoc:
- @base_path, @assigns = base_path, assigns_for_first_render
+ def initialize(view_paths = [], assigns_for_first_render = {}, controller = nil)#:nodoc:
+ @view_paths = [*view_paths].compact
+ @assigns = assigns_for_first_render
@assigns_added = nil
@controller = controller
@logger = controller && controller.logger
end
# Renders the template present at <tt>template_path</tt>. If <tt>use_full_path</tt> is set to true,
- # it's relative to the template_root, otherwise it's absolute. The hash in <tt>local_assigns</tt>
+ # it's relative to the view_paths array, otherwise it's absolute. The hash in <tt>local_assigns</tt>
# is made available as local variables.
def render_file(template_path, use_full_path = true, local_assigns = {}) #:nodoc:
@first_render ||= template_path
@@ -268,12 +269,12 @@ module ActionView #:nodoc:
e.sub_template_of(template_file_name)
raise e
else
- raise TemplateError.new(@base_path, template_file_name, @assigns, template_source, e)
+ raise TemplateError.new(find_base_path_for(template_file_name), template_file_name, @assigns, template_source, e)
end
end
end
-
- # Renders the template present at <tt>template_path</tt> (relative to the template_root).
+
+ # Renders the template present at <tt>template_path</tt> (relative to the view_paths array).
# The hash in <tt>local_assigns</tt> is made available as local variables.
def render(options = {}, old_local_assigns = {}, &block) #:nodoc:
if options.is_a?(String)
@@ -358,12 +359,11 @@ module ActionView #:nodoc:
def file_exists?(template_path)#:nodoc:
template_file_name, template_file_extension = path_and_extension(template_path)
-
if template_file_extension
template_exists?(template_file_name, template_file_extension)
else
cached_template_extension(template_path) ||
- %w(erb builder javascript delegate).any? do |template_type|
+ %w(erb builder javascript delegate).any? do |template_type|
send("#{template_type}_template_exists?", template_path)
end
end
@@ -376,7 +376,9 @@ module ActionView #:nodoc:
private
def full_template_path(template_path, extension)
- "#{@base_path}/#{template_path}.#{extension}"
+ file_name = "#{template_path}.#{extension}"
+ base_path = find_base_path_for(file_name)
+ "#{base_path}/#{file_name}"
end
def template_exists?(template_path, extension)
@@ -392,7 +394,11 @@ module ActionView #:nodoc:
def cached_template_extension(template_path)
@@cache_template_extensions && @@cached_template_extension[template_path]
end
-
+
+ def find_base_path_for(template_file_name)
+ @view_paths.find { |p| File.file?(File.join(p, template_file_name)) }
+ end
+
def find_template_extension_for(template_path)
if match = delegate_template_exists?(template_path)
match.first.to_sym
@@ -400,7 +406,7 @@ module ActionView #:nodoc:
elsif builder_template_exists?(template_path): :rxml
elsif javascript_template_exists?(template_path): :rjs
else
- raise ActionViewError, "No rhtml, rxml, rjs or delegate template found for #{template_path} in #{@base_path}"
+ raise ActionViewError, "No rhtml, rxml, rjs or delegate template found for #{template_path} in #{@view_paths.inspect}"
end
end
@@ -536,7 +542,7 @@ module ActionView #:nodoc:
logger.debug "Backtrace: #{e.backtrace.join("\n")}"
end
- raise TemplateError.new(@base_path, file_name || template, @assigns, template, e)
+ raise TemplateError.new(lookup_template_base_path_for(file_name || template), file_name || template, @assigns, template, e)
end
@@compile_time[render_symbol] = Time.now
@@ -545,4 +551,4 @@ module ActionView #:nodoc:
end
end
-require 'action_view/template_error'
+require 'action_view/template_error' \ No newline at end of file
diff --git a/actionpack/test/activerecord/pagination_test.rb b/actionpack/test/activerecord/pagination_test.rb
index ddd2cec8b3..49f153e26e 100644
--- a/actionpack/test/activerecord/pagination_test.rb
+++ b/actionpack/test/activerecord/pagination_test.rb
@@ -4,7 +4,7 @@ class PaginationTest < ActiveRecordTestCase
fixtures :topics, :replies, :developers, :projects, :developers_projects
class PaginationController < ActionController::Base
- self.template_root = "#{File.dirname(__FILE__)}/../fixtures/"
+ self.view_paths = [ "#{File.dirname(__FILE__)}/../fixtures/" ]
def simple_paginate
@topic_pages, @topics = paginate(:topics)
diff --git a/actionpack/test/controller/action_pack_assertions_test.rb b/actionpack/test/controller/action_pack_assertions_test.rb
index d9cfe18ae5..f9a641a1ec 100644
--- a/actionpack/test/controller/action_pack_assertions_test.rb
+++ b/actionpack/test/controller/action_pack_assertions_test.rb
@@ -152,7 +152,7 @@ end
# tell the controller where to find its templates but start from parent
# directory of test_request_response to simulate the behaviour of a
# production environment
-ActionPackAssertionsController.template_root = File.dirname(__FILE__) + "/../fixtures/"
+ActionPackAssertionsController.view_paths = [ File.dirname(__FILE__) + "/../fixtures/" ]
# a test case to exercise the new capabilities TestRequest & TestResponse
class ActionPackAssertionsControllerTest < Test::Unit::TestCase
diff --git a/actionpack/test/controller/addresses_render_test.rb b/actionpack/test/controller/addresses_render_test.rb
index 4de1c80505..6c5424a5b6 100644
--- a/actionpack/test/controller/addresses_render_test.rb
+++ b/actionpack/test/controller/addresses_render_test.rb
@@ -22,7 +22,7 @@ class AddressesTestController < ActionController::Base
def self.controller_path; "addresses"; end
end
-AddressesTestController.template_root = File.dirname(__FILE__) + "/../fixtures/"
+AddressesTestController.view_paths = [ File.dirname(__FILE__) + "/../fixtures/" ]
class AddressesTest < Test::Unit::TestCase
def setup
diff --git a/actionpack/test/controller/capture_test.rb b/actionpack/test/controller/capture_test.rb
index 43bf346eef..300bdc3a84 100644
--- a/actionpack/test/controller/capture_test.rb
+++ b/actionpack/test/controller/capture_test.rb
@@ -23,7 +23,7 @@ class CaptureController < ActionController::Base
def rescue_action(e) raise end
end
-CaptureController.template_root = File.dirname(__FILE__) + "/../fixtures/"
+CaptureController.view_paths = [ File.dirname(__FILE__) + "/../fixtures/" ]
class CaptureTest < Test::Unit::TestCase
def setup
diff --git a/actionpack/test/controller/content_type_test.rb b/actionpack/test/controller/content_type_test.rb
index 6f0618da0e..1841d37c0b 100644
--- a/actionpack/test/controller/content_type_test.rb
+++ b/actionpack/test/controller/content_type_test.rb
@@ -45,7 +45,7 @@ class ContentTypeController < ActionController::Base
def rescue_action(e) raise end
end
-ContentTypeController.template_root = File.dirname(__FILE__) + "/../fixtures/"
+ContentTypeController.view_paths = [ File.dirname(__FILE__) + "/../fixtures/" ]
class ContentTypeTest < Test::Unit::TestCase
def setup
diff --git a/actionpack/test/controller/deprecation/deprecated_base_methods_test.rb b/actionpack/test/controller/deprecation/deprecated_base_methods_test.rb
index d8da676f96..3256b77477 100644
--- a/actionpack/test/controller/deprecation/deprecated_base_methods_test.rb
+++ b/actionpack/test/controller/deprecation/deprecated_base_methods_test.rb
@@ -21,7 +21,7 @@ class DeprecatedBaseMethodsTest < Test::Unit::TestCase
def rescue_action(e) raise e end
end
- Target.template_root = File.dirname(__FILE__) + "/../../fixtures"
+ Target.view_paths = [ File.dirname(__FILE__) + "/../../fixtures" ]
def setup
@request = ActionController::TestRequest.new
diff --git a/actionpack/test/controller/layout_test.rb b/actionpack/test/controller/layout_test.rb
index 9338bfa6f9..cade6738a7 100644
--- a/actionpack/test/controller/layout_test.rb
+++ b/actionpack/test/controller/layout_test.rb
@@ -1,15 +1,17 @@
require File.dirname(__FILE__) + '/../abstract_unit'
-# The template_root must be set on Base and not LayoutTest so that LayoutTest's inherited method has access to
-# the template_root when looking for a layout
-ActionController::Base.template_root = File.dirname(__FILE__) + '/../fixtures/layout_tests/'
+# The view_paths array must be set on Base and not LayoutTest so that LayoutTest's inherited
+# method has access to the view_paths array when looking for a layout to automatically assign.
+old_load_paths = ActionController::Base.view_paths
+ActionController::Base.view_paths = [ File.dirname(__FILE__) + '/../fixtures/layout_tests/' ]
class LayoutTest < ActionController::Base
def self.controller_path; 'views' end
+ self.view_paths = ActionController::Base.view_paths.dup
end
-# Restore template root to be unset
-ActionController::Base.template_root = nil
+# Restore view_paths to previous value
+ActionController::Base.view_paths = old_load_paths
class ProductController < LayoutTest
end
diff --git a/actionpack/test/controller/mime_responds_test.rb b/actionpack/test/controller/mime_responds_test.rb
index 5692d26232..3a1df02a7f 100644
--- a/actionpack/test/controller/mime_responds_test.rb
+++ b/actionpack/test/controller/mime_responds_test.rb
@@ -118,7 +118,7 @@ class RespondToController < ActionController::Base
end
end
-RespondToController.template_root = File.dirname(__FILE__) + "/../fixtures/"
+RespondToController.view_paths = [ File.dirname(__FILE__) + "/../fixtures/" ]
class MimeControllerTest < Test::Unit::TestCase
def setup
diff --git a/actionpack/test/controller/new_render_test.rb b/actionpack/test/controller/new_render_test.rb
index 9b328e2c0a..70bb18cadc 100644
--- a/actionpack/test/controller/new_render_test.rb
+++ b/actionpack/test/controller/new_render_test.rb
@@ -350,8 +350,8 @@ class NewRenderTestController < ActionController::Base
end
end
-NewRenderTestController.template_root = File.dirname(__FILE__) + "/../fixtures/"
-Fun::GamesController.template_root = File.dirname(__FILE__) + "/../fixtures/"
+NewRenderTestController.view_paths = [ File.dirname(__FILE__) + "/../fixtures/" ]
+Fun::GamesController.view_paths = [ File.dirname(__FILE__) + "/../fixtures/" ]
class NewRenderTest < Test::Unit::TestCase
def setup
diff --git a/actionpack/test/controller/render_test.rb b/actionpack/test/controller/render_test.rb
index d364dd6c93..bf9042ec7a 100644
--- a/actionpack/test/controller/render_test.rb
+++ b/actionpack/test/controller/render_test.rb
@@ -134,8 +134,8 @@ class TestController < ActionController::Base
end
end
-TestController.template_root = File.dirname(__FILE__) + "/../fixtures/"
-Fun::GamesController.template_root = File.dirname(__FILE__) + "/../fixtures/"
+TestController.view_paths = [ File.dirname(__FILE__) + "/../fixtures/" ]
+Fun::GamesController.view_paths = [ File.dirname(__FILE__) + "/../fixtures/" ]
class RenderTest < Test::Unit::TestCase
def setup
diff --git a/actionpack/test/controller/send_file_test.rb b/actionpack/test/controller/send_file_test.rb
index 83590fd73e..e7ebc91676 100644
--- a/actionpack/test/controller/send_file_test.rb
+++ b/actionpack/test/controller/send_file_test.rb
@@ -21,7 +21,7 @@ class SendFileController < ActionController::Base
def rescue_action(e) raise end
end
-SendFileController.template_root = File.dirname(__FILE__) + "/../fixtures/"
+SendFileController.view_paths = [ File.dirname(__FILE__) + "/../fixtures/" ]
class SendFileTest < Test::Unit::TestCase
include TestFileUtils
diff --git a/actionpack/test/controller/view_paths_test.rb b/actionpack/test/controller/view_paths_test.rb
new file mode 100644
index 0000000000..9184ab1793
--- /dev/null
+++ b/actionpack/test/controller/view_paths_test.rb
@@ -0,0 +1,78 @@
+require File.dirname(__FILE__) + '/../abstract_unit'
+
+class ViewLoadPathsTest < Test::Unit::TestCase
+
+ LOAD_PATH_ROOT = File.join(File.dirname(__FILE__), '..', 'fixtures')
+
+ class TestController < ActionController::Base
+ def self.controller_path() "test" end
+ def rescue_action(e) raise end
+
+ def hello_world() end
+ end
+
+ def setup
+ TestController.view_paths = [ LOAD_PATH_ROOT ]
+ @controller = TestController.new
+ @request = ActionController::TestRequest.new
+ @response = ActionController::TestResponse.new
+
+ # Track the last warning.
+ @old_behavior = ActiveSupport::Deprecation.behavior
+ @last_message = nil
+ ActiveSupport::Deprecation.behavior = Proc.new { |message| @last_message = message }
+ end
+
+ def teardown
+ ActiveSupport::Deprecation.behavior = @old_behavior
+ end
+
+ def test_template_load_path_was_set_correctly
+ assert_equal [ LOAD_PATH_ROOT ], @controller.view_paths
+ end
+
+ def test_view_paths
+ get :hello_world
+ assert_response :success
+ assert_equal "Hello world!", @response.body
+ end
+
+ def test_view_paths_override
+ TestController.view_paths.unshift "#{LOAD_PATH_ROOT}/override"
+ get :hello_world
+ assert_response :success
+ assert_equal "Hello overridden world!", @response.body
+ end
+
+ def test_template_root_deprecated
+ assert_deprecated(/template_root.*view_paths/) do
+ TestController.template_root = LOAD_PATH_ROOT
+ end
+ assert_deprecated(/template_root.*view_paths/) do
+ assert_equal LOAD_PATH_ROOT, TestController.template_root
+ end
+ end
+
+ def test_inheritance
+ original_load_paths = ActionController::Base.view_paths
+
+ self.class.class_eval %{
+ class A < ActionController::Base; end
+ class B < A; end
+ class C < ActionController::Base; end
+ }
+
+ A.view_paths = [ 'a/path' ]
+
+ assert_equal [ 'a/path' ], A.view_paths
+ 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' }
+ end
+
+end \ No newline at end of file
diff --git a/actionpack/test/fixtures/override/test/hello_world.rhtml b/actionpack/test/fixtures/override/test/hello_world.rhtml
new file mode 100644
index 0000000000..3e308d3d86
--- /dev/null
+++ b/actionpack/test/fixtures/override/test/hello_world.rhtml
@@ -0,0 +1 @@
+Hello overridden world! \ No newline at end of file
diff --git a/actionpack/test/template/deprecated_instance_variables_test.rb b/actionpack/test/template/deprecated_instance_variables_test.rb
index 3a8d620b34..d3cffbc1e9 100644
--- a/actionpack/test/template/deprecated_instance_variables_test.rb
+++ b/actionpack/test/template/deprecated_instance_variables_test.rb
@@ -2,7 +2,7 @@ require "#{File.dirname(__FILE__)}/../abstract_unit"
class DeprecatedViewInstanceVariablesTest < Test::Unit::TestCase
class DeprecatedInstanceVariablesController < ActionController::Base
- self.template_root = "#{File.dirname(__FILE__)}/../fixtures/"
+ self.view_paths = [ "#{File.dirname(__FILE__)}/../fixtures/" ]
def self.controller_path; 'deprecated_instance_variables' end
diff --git a/actionpack/test/template/url_helper_test.rb b/actionpack/test/template/url_helper_test.rb
index 6080275379..8cef4ffe14 100644
--- a/actionpack/test/template/url_helper_test.rb
+++ b/actionpack/test/template/url_helper_test.rb
@@ -250,7 +250,7 @@ end
class UrlHelperWithControllerTest < Test::Unit::TestCase
class UrlHelperController < ActionController::Base
- self.template_root = "#{File.dirname(__FILE__)}/../fixtures/"
+ self.view_paths = [ "#{File.dirname(__FILE__)}/../fixtures/" ]
def self.controller_path; 'url_helper_with_controller' end
@@ -305,7 +305,7 @@ end
class LinkToUnlessCurrentWithControllerTest < Test::Unit::TestCase
class TasksController < ActionController::Base
- self.template_root = "#{File.dirname(__FILE__)}/../fixtures/"
+ self.view_paths = ["#{File.dirname(__FILE__)}/../fixtures/"]
def self.controller_path; 'tasks' end