# Inspiration from Bruce Williams [http://codefluency.com/articles/2006/07/01/rails-views-getting-in-context/] module Tracks module SourceViewSwitching class Responder def initialize(source_view) @source_view = source_view.underscore.gsub(/\s+/,'_').to_sym rescue nil end def nil? yield if @source_view.nil? && block_given? end def method_missing(check_source_view,*args) yield if check_source_view == @source_view && block_given? end end module Controller def self.included(base) base.send(:helper, Tracks::SourceViewSwitching::Helper) base.send(:helper_method, :source_view) end def source_view_is( s ) s == (params[:_source_view] || @source_view).to_sym end def source_view_is_one_of( *s ) s.include?(params[:_source_view].to_sym) end def source_view responder = Tracks::SourceViewSwitching::Responder.new(params[:_source_view] || @source_view) block_given? ? yield(responder) : responder end end module Helper def source_view_tag(name) hidden_field_tag :_source_view, name.underscore.gsub(/\s+/,'_') end def source_view_is( s ) s == (params[:_source_view] || @source_view).to_sym end def source_view_is_one_of( *s ) s.include?(params[:_source_view].to_sym) end end end end ActionController::Base.send(:include, Tracks::SourceViewSwitching::Controller)