Nadat ik de dutch_date_select helper voor form_for had gepost moest ik gewoon uitzoeken hoe je extra methods aan bijvoorbeeld de String class kunt toevoegen. Ik dacht meteen aan een helper die ik een keer had gemaakt om dit uit te testen: Dottify. Deze helper zorgt ervoor dat je een String kunt afknippen en puntjes erachter kunt zetten als het nodig is. Deze zag er zo uit:

def dottify(text, len)
    "#{text[0..len-1]}#{"..." if text.length > len}"
end

Je geeft dus de string en de lengte mee om er wel of niet puntjes achter te zetten. Het leek mij een stuk handiger als je dit direct op een String kunt aanroepen. Ik ben gaan zoeken hoe dit moet en het bleek behoorlijk simpel te zijn.

Het eerste wat je moet doen is een bestand aanmaken in de /lib map. Noem deze ‘core_extensions.rb’. Hierin stop je het volgende:

class String
  def dottify(len)
    "#{self[0..len-1]}#{"..." if self.length > len}"
  end
end

Je doet dus gewoon ‘class String’ en kunt hierin allerlei methods toevoegen. Je spreekt de String zelf steeds aan met ’self’. Je kunt dit dus ook met Integer e.d. doen, maar ook met Rails classes zoals die ik gebruikte in dutch_date_select. Je moet echter nog wel iets doen om dit te laten werken. Maak een bestand aan in /config/initializers en noem deze ‘load_extensions.rb’. Stop hier het volgende in:

require 'core_extensions'

Nu wordt elke keer als de server wordt opgestart ‘core_extensions.rb’ ingeladen. Let dus op: elke keer als je een aanpassing doet moet je de server opnieuw opstarten. Je kunt in ‘core_extensions.rb’ alle aanpassingen aan de verschillende classes doen. Je kunt er ook voor kiezen om dit op te delen in meerdere bestanden. Vergeet deze dan niet toe te voegen aan ‘load_extensions.rb’, zodat ze daadwerkelijk worden ingeladen.

Vrij simpel toch? Om nu Dottify te gebruiken doe je het volgende:

"Dit is een String".dottify(6)   # => "Dit is..."

Hopelijk hebben jullie er wat aan. :)