Merb::Slices::ControllerMixin::ClassMethods

Public Instance Methods

controller_for_slice(slice_module = nil, options = {}) click to toggle source

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 lib/merb-slices/controller_mixin.rb, line 63
def controller_for_slice(slice_module = nil, options = {})
  options, slice_module = slice_module.merge(options), nil if slice_module.is_a?(Hash)
  slice_module ||= self.name.split('::').first
  options[:templates_for] = :view unless options.key?(:templates_for)
  if slice_mod = Merb::Slices[slice_module.to_s]
    # Include the instance methods
    unless self.kind_of?(Merb::Slices::ControllerMixin::MixinMethods)
      self.send(:extend, Merb::Slices::ControllerMixin::MixinMethods)
    end
    # Reference this controller's slice module
    self.class_inheritable_accessor :slice, :instance_writer => false
    self.slice = slice_mod
    # Setup template roots
    if options[:templates_for]
      self._template_root  = join_template_path(slice_mod.dir_for(options[:templates_for]), options[:path])
      self._template_roots = []
      # app-level app/views directory for shared and fallback views, layouts and partials
      self._template_roots << [join_template_path(Merb.dir_for(options[:templates_for]), options[:path]), :_template_location] if Merb.dir_for(options[:templates_for])
      # slice-level app/views for the standard supplied views
      self._template_roots << [self._template_root, :_slice_template_location] 
      # app-level slices/<slice>/app/views for specific overrides
      self._template_roots << [join_template_path(slice_mod.app_dir_for(options[:templates_for]), options[:path]), :_slice_template_location]
      # additional template roots for specific overrides (optional)
      self._template_roots += Array(options[:template_roots]) if options[:template_roots]
    end
    # Set the layout for this slice controller
    layout_for_slice(options[:layout])
  end
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.