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?