aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack
diff options
context:
space:
mode:
authorJeremy Kemper <jeremy@bitsweat.net>2006-09-16 01:31:17 +0000
committerJeremy Kemper <jeremy@bitsweat.net>2006-09-16 01:31:17 +0000
commit35ffc1afbe583809e7a45945f381cb3b97aac7e9 (patch)
tree3f15c8856bca65f214940a52c473fba811e80060 /actionpack
parent2271c17da17511ea0800a60bc5017ba0b2368438 (diff)
downloadrails-35ffc1afbe583809e7a45945f381cb3b97aac7e9.tar.gz
rails-35ffc1afbe583809e7a45945f381cb3b97aac7e9.tar.bz2
rails-35ffc1afbe583809e7a45945f381cb3b97aac7e9.zip
Declare file extensions exempt from layouts. Closes #6219.
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@5126 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
Diffstat (limited to 'actionpack')
-rw-r--r--actionpack/CHANGELOG3
-rwxr-xr-xactionpack/lib/action_controller/base.rb16
-rw-r--r--actionpack/test/controller/layout_test.rb33
3 files changed, 51 insertions, 1 deletions
diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG
index baaf7f2ddc..518d3771b9 100644
--- a/actionpack/CHANGELOG
+++ b/actionpack/CHANGELOG
@@ -1,5 +1,8 @@
*SVN*
+* Declare file extensions exempt from layouts. #6219 [brandon]
+ Example: ActionController::Base.exempt_from_layout 'rpdf'
+
* Add chained replace/update support for assert_select_rjs [Rick Olson]
Given RJS like...
diff --git a/actionpack/lib/action_controller/base.rb b/actionpack/lib/action_controller/base.rb
index f42686c318..c971989582 100755
--- a/actionpack/lib/action_controller/base.rb
+++ b/actionpack/lib/action_controller/base.rb
@@ -315,6 +315,9 @@ module ActionController #:nodoc:
# Returns the name of the action this controller is processing.
attr_accessor :action_name
+ # Templates that are exempt from layouts
+ @@exempt_from_layout = Set.new([/\.rjs$/])
+
class << self
# Factory for the standard create, process loop where the controller is discarded after processing.
def process(request, response) #:nodoc:
@@ -395,6 +398,14 @@ module ActionController #:nodoc:
filtered_parameters
end
end
+
+ # Don't render layouts for templates with the given extensions.
+ def exempt_from_layout(*extensions)
+ regexps = extensions.collect do |extension|
+ extension.is_a?(Regexp) ? extension : /\.#{Regexp.escape(extension.to_s)}$/
+ end
+ @@exempt_from_layout.merge regexps
+ end
end
public
@@ -1094,7 +1105,10 @@ module ActionController #:nodoc:
end
def template_exempt_from_layout?(template_name = default_template_name)
- template_name =~ /\.rjs$/ || (@template.pick_template_extension(template_name) == :rjs rescue false)
+ @@exempt_from_layout.any? { |ext| template_name =~ ext } or
+ @template.pick_template_extension(template_name) == :rjs
+ rescue
+ false
end
def assert_existence_of_template_file(template_name)
diff --git a/actionpack/test/controller/layout_test.rb b/actionpack/test/controller/layout_test.rb
index bbb13d0320..3e1d3d9644 100644
--- a/actionpack/test/controller/layout_test.rb
+++ b/actionpack/test/controller/layout_test.rb
@@ -72,6 +72,39 @@ class LayoutAutoDiscoveryTest < Test::Unit::TestCase
end
end
+class ExemptFromLayoutTest < Test::Unit::TestCase
+ def setup
+ @controller = LayoutTest.new
+ end
+
+ def test_rjs_exempt_from_layout
+ assert @controller.send(:template_exempt_from_layout?, 'test.rjs')
+ end
+
+ def test_rhtml_and_rxml_not_exempt_from_layout
+ assert !@controller.send(:template_exempt_from_layout?, 'test.rhtml')
+ assert !@controller.send(:template_exempt_from_layout?, 'test.rxml')
+ end
+
+ def test_other_extension_not_exempt_from_layout
+ assert !@controller.send(:template_exempt_from_layout?, 'test.random')
+ end
+
+ def test_add_extension_to_exempt_from_layout
+ ['rpdf', :rpdf].each do |ext|
+ assert_nothing_raised do
+ ActionController::Base.exempt_from_layout ext
+ end
+ assert @controller.send(:template_exempt_from_layout?, "test.#{ext}")
+ end
+ end
+
+ def test_add_regexp_to_exempt_from_layout
+ ActionController::Base.exempt_from_layout /\.rdoc/
+ assert @controller.send(:template_exempt_from_layout?, 'test.rdoc')
+ end
+end
+
class DefaultLayoutController < LayoutTest
end