^ e $ não funcionam exatamente como se espera no Ruby. Eles vão fazer match na linha, não na string completa.

O correto é utilizar `\A` em vez de `^` e `\Z` em vez de `$`.