Module | Merb::Slices::ControllerMixin::ClassMethods |
In: |
merb-slices/lib/merb-slices/controller_mixin.rb
|
Setup a controller to reference a slice and its template roots
This method is available to any class inheriting from Merb::AbstractController; it enabled correct location of templates, as well as access to the slice module.
@param slice_module<to_s> The slice module to use; defaults to current module. @param options<Hash>
Optional parameters to set which component path is used (defaults to :view) and the :path option lets you specify a subdirectory of that component path. When :layout is set, then this is used instead of the config's :layout setting.
@example controller_for_slice # uses current module @example controller_for_slice SliceMod # defaults to :view templates and no subdirectory @example controller_for_slice :templates_for => :mailer, :path => ‘views’ # for Merb::Mailer @example controller_for_slice SliceMod, :templates_for => :mailer, :path => ‘views’ # for Merb::Mailer
# File merb-slices/lib/merb-slices/controller_mixin.rb, line 63 63: def controller_for_slice(slice_module = nil, options = {}) 64: options, slice_module = slice_module.merge(options), nil if slice_module.is_a?(Hash) 65: slice_module ||= self.name.split('::').first 66: options[:templates_for] = :view unless options.key?(:templates_for) 67: if slice_mod = Merb::Slices[slice_module.to_s] 68: # Include the instance methods 69: unless self.kind_of?(Merb::Slices::ControllerMixin::MixinMethods) 70: self.send(:extend, Merb::Slices::ControllerMixin::MixinMethods) 71: end 72: # Reference this controller's slice module 73: self.class_inheritable_accessor :slice, :instance_writer => false 74: self.slice = slice_mod 75: # Setup template roots 76: if options[:templates_for] 77: self._template_root = join_template_path(slice_mod.dir_for(options[:templates_for]), options[:path]) 78: self._template_roots = [] 79: # app-level app/views directory for shared and fallback views, layouts and partials 80: self._template_roots << [join_template_path(Merb.dir_for(options[:templates_for]), options[:path]), :_template_location] if Merb.dir_for(options[:templates_for]) 81: # slice-level app/views for the standard supplied views 82: self._template_roots << [self._template_root, :_slice_template_location] 83: # app-level slices/<slice>/app/views for specific overrides 84: self._template_roots << [join_template_path(slice_mod.app_dir_for(options[:templates_for]), options[:path]), :_slice_template_location] 85: # additional template roots for specific overrides (optional) 86: self._template_roots += Array(options[:template_roots]) if options[:template_roots] 87: end 88: # Set the layout for this slice controller 89: layout_for_slice(options[:layout]) 90: end 91: end