blank?
è una comodissima estensione che restituisce true
nel caso l'oggetto sia vuoto, abbia valore false
o stringa con spazi. Questo metodo è molto utile per eseguire la validazione di un dato in ingresso senza conoscerne con certezza il tipo di istanza.
require '../helper' [].blank? # => true ''.blank? # => true ' '.blank? # => true nil.blank? # => true false.blank? # => true # Password invalida: parametro inesistente. params = { :username => 'bar' } params[:username].blank? # => false params[:password].blank? # => true # Password invalida: stringa vuota. params = { :username => 'bar', :password => ' ' } params[:username].blank? # => false params[:password].blank? # => true
duplicable?
è un altro metodo accessorio che restituisce true
nel caso in cui l'oggetto sia duplicabile in sicurezza con il metodo Class#dup
.
Parlando di eccezioni, ActiveSupport fornisce alcuni metodi utili per migliorare la leggibilità di un errore. Exception#application_backtrace
rimuove dalla backtrace le righe che non fanno riferimento all'applicazione corrette riducendo le righe necessarie ad un eventuale debug dell'errore. Exception#framework_backtrace
è invece il metodo opposto.
Sul fronte Enumerable
, vale la pena citare l'introduzione di #group_by
, utile a raggruppare gli elementi per un valore specifico, preso in prestito da Ruby 1.9. #sum
restituisce la somma degli elementi, #many?
è invece una veloce scorciatoia per scoprire se il numero degli elementi è maggiore di 1.
require '../helper' class Car < Struct.new(:color) end cars = %w(red blue white yellow).map { |c| Car.new(c) } cars # => [#<struct Car color="red">, #<struct Car color="blue">, ... ] cars.index_by(&:color).inspect # => {"white"=>#<struct Car color="white">, "blue"=>#<struct Car color="blue">, ... } %w(foo).many? # => false %w(foo bar baz).many? # => true [5, 15, 10].sum# => 30
Infine, esaminiamo una di quelle estensioni tanto illeggibili quanto spettacolari. Tecnicamente parliamo di Symbol#to_proc
, ci riferiamo quindi alla pratica di passare un simbolo come parametro ad un oggetto che si aspetta un blocco per veder chiamato il metodo corrispondente al simbolo all'interno del blocco. Un esempio è d'obbligo.
require '../helper' colors = %w(red blue white yellow) # => ["red", "blue", "white", "yellow"] firsts = colors.collect(&:first) firsts.inspect # => ["r", "b", "w", "y"] # Equivale a chiamare first su ogni elemento firsts = colors.collect { |element| element.first } colors.collect(&:first).collect(&:to_sym) # => [:r, :b, :w, :y] # Equivale a chiamare first su ogni elemento # ed in sequenza to_sym colors.collect do |element| element.first end.collect do |f| f.to_sym end
È utile familiarizzare con questi metodi: si trovano molto frequentemente in qualsiasi applicazione Ruby, specialmente se si tratta di un progetto Rails.