Making Static Methods a First Class Citizen

Static methods are the syntactic vinegar of Ruby, they need some extra Syntax to declare and are cumbersome to call. Yet they are the best one can do to get reusable and testable components. Magic to the rescue!

class SomeKindOfClass
  def normal
    self.class.static_normal
  end

  def self.static_normal
  end
end

#self.class.static_normal is not very nice...
#but we could do klass.static_method or static.static_method with:
class Object
  def klass
    self.class
  end
end

#Or go extreme and allow class methods to be called like instance methods
#SomeKindOfClass.new.static_normal
class Object
  def method_missing name, *args
    return self.class.send(name, *args) if self.class.respond_to? name
    super
  end
end

Getting the Caller Method in Ruby

Need to know which method called you ? Its as simple as:
caller = CallChain.caller_method

Alternatively it could be added to Object, but that would be dirty 😉

class CallChain
  def self.caller_method(depth=1)
    parse_caller(caller(depth+1).first).last
  end

  private

  #Stolen from ActionMailer, where this was used but was not made reusable
  def self.parse_caller(at)
    if /^(.+?):(\d+)(?::in `(.*)')?/ =~ at
      file   = Regexp.last_match[1]
      line   = Regexp.last_match[2].to_i
      method = Regexp.last_match[3]
      [file, line, method]
    end
  end
end

ActionView Standalone

require 'action_view'
require 'action_controller/mime' # for Rails 2

render :file=>'foo.html.erb', :locals=>{:user=>User.first}
render :file=>'lib/data_feed.xml.builder', :type=>:rxml, :locals=>{:user=>User.first)

def render(options)
  klass = Class.new(ActionView::Base)
  klass.class_eval{ def url_for(x);x;end } # to be able to use link_to
  klass.new.render(options)
end

All ActionView Helpers on Strings

Insert all the helpers you want and “go!”.strip_tags.auto_link.truncate(25)

# ActionView text helpers
# https://grosser.it/2009/05/30/all-actionview-helpers-on-strings/
class String
  %w[auto_link excerpt highlight sanitize simple_format strip_tags word_wrap].each do |method|
    define_method method do |*args|
      ActionController::Base.helpers.send method, self, *args
    end
  end

  # called with a number or with :length=>10
  def truncate(*args)
    if args.first.is_a?(Hash)
      ActionController::Base.helpers.truncate(self, *args)
    else
      ActionController::Base.helpers.truncate(self, :length=>args[0])
    end
  end
end