aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_controller/abstract/layouts.rb
diff options
context:
space:
mode:
authorYehuda Katz + Carl Lerche <ykatz+clerche@engineyard.com>2009-05-21 18:14:20 -0700
committerYehuda Katz + Carl Lerche <ykatz+clerche@engineyard.com>2009-05-21 18:14:20 -0700
commit68a207ccf6dffa58c9a9a3e221b99af72859ce27 (patch)
treeecd6d662ef61a66669f4e6cd46190418dc8111f9 /actionpack/lib/action_controller/abstract/layouts.rb
parent6923b392b740f2346326634532b40cf24a0f26ef (diff)
downloadrails-68a207ccf6dffa58c9a9a3e221b99af72859ce27.tar.gz
rails-68a207ccf6dffa58c9a9a3e221b99af72859ce27.tar.bz2
rails-68a207ccf6dffa58c9a9a3e221b99af72859ce27.zip
Implemented layout conditions in new base
Diffstat (limited to 'actionpack/lib/action_controller/abstract/layouts.rb')
-rw-r--r--actionpack/lib/action_controller/abstract/layouts.rb25
1 files changed, 22 insertions, 3 deletions
diff --git a/actionpack/lib/action_controller/abstract/layouts.rb b/actionpack/lib/action_controller/abstract/layouts.rb
index 96cb05972f..557d68d866 100644
--- a/actionpack/lib/action_controller/abstract/layouts.rb
+++ b/actionpack/lib/action_controller/abstract/layouts.rb
@@ -4,11 +4,19 @@ module AbstractController
depends_on Renderer
+ included do
+ extlib_inheritable_accessor :_layout_conditions
+ self._layout_conditions = {}
+ end
+
module ClassMethods
- def layout(layout)
+ def layout(layout, conditions = {})
unless [String, Symbol, FalseClass, NilClass].include?(layout.class)
raise ArgumentError, "Layouts must be specified as a String, Symbol, false, or nil"
end
+
+ conditions.each {|k, v| conditions[k] = Array(v).map {|a| a.to_s} }
+ self._layout_conditions = conditions
@_layout = layout || false # Converts nil to false
_write_layout_method
@@ -75,17 +83,28 @@ module AbstractController
end
def _default_layout(require_layout = false)
- if require_layout && !_layout
+ if require_layout && _action_has_layout? && !_layout
raise ArgumentError,
"There was no default layout for #{self.class} in #{view_paths.inspect}"
end
begin
- layout = _layout_for_name(_layout)
+ _layout_for_name(_layout) if _action_has_layout?
rescue NameError => e
raise NoMethodError,
"You specified #{@_layout.inspect} as the layout, but no such method was found"
end
end
+
+ def _action_has_layout?
+ conditions = _layout_conditions
+ if only = conditions[:only]
+ only.include?(action_name)
+ elsif except = conditions[:except]
+ !except.include?(action_name)
+ else
+ true
+ end
+ end
end
end \ No newline at end of file