Por muchos años que lleves utilizando Rails, siempre te encontrarás navegando por la documentación con clases de lo más útiles y que probablemente estés usando de forma indirecta sin conocerlo.

Intentaré a lo largo de una serie de entradas como ésta ir contando cosas sobre algunas de las más importantes “en la sombra”.

ActiveSupport::StringInquirer

Introducida en la versión 2.2, y dando un uso curioso a method_missing, esta clase es la que está detrás de la “magia” de que:

Rails.env == "production"

también se pueda escribir como:

Rails.env.production?

En una clase real podríamos hacer algo como:

class Video
  def initialize(title)
    @title = title
  end

  def title
    ActiveSupport::StringInquirer.new(@title)
  end
end

v = Video.new("awesome")
v.title.radical? # => false
v.title.awesome? # => true
ActiveSupport::MessageVerifier

Esta clase nos acompaña desde Rails 2.3. Al igual que la clase anterior, es raro que la hayas utilizado de forma directa, pero seguro que más de una vez en tu código has escrito algo como

cookies.permanent.signed[:remember_me] = [current_user.id, current_user.salt]

La implementación de cookies.signed se basa en el uso de MessageVerifier, una clase especializada en generar mensajes firmados con una clave (en el caso de las cookies, ActionController::Base.cookie_verifier_secret). Para MessageVerifier un mensaje puede ser tanto una cadena de texto como cualquier cosa susceptible de ser serializada.

>> @verifier = ActiveSupport::MessageVerifier.new("nuestra-clave-secreta")
=> #<ActiveSupport::MessageVerifier:0x007fe10cb32438 @secret="nuestra-clave-secreta", @digest="SHA1", @serializer=Marshal>
>> @verifier.generate(["Hola", "Mundo"])
=> "BAhbB0kiCUhvbGEGOgZFVEkiCk11bmRvBjsAVA==--f2c2e657ec1501c984d8c44154b398a3a2ac9cbc"
>> mensaje_cifrado = @verifier.generate(["Hola", "Mundo"])
=> "BAhbB0kiCUhvbGEGOgZFVEkiCk11bmRvBjsAVA==--f2c2e657ec1501c984d8c44154b398a3a2ac9cbc"
>> @verifier.verify(mensaje_cifrado)
=> ["Hola", "Mundo"]

Dentro de la serialización por defecto se utiliza Marshall, pero si por ejemplo preferimos utilizar YAML podríamos hacer algo como:

@verifier.serializer = YAML

Y hasta aquí por hoy. ¿Qué otras clases curiosas te has encontrado utilizando Rails en tu día a día?