Para quem vê isso mais tarde, como atualmente (agosto de 2017) supera o google: vale a pena mencionar, que esse comportamento será alterado no Rails 5.2 e possui avisos de descontinuação no Rails 5.1, pois o ActiveModel :: Dirty mudou um pouco .
O que eu mudo?
Se você estiver usando o attribute_changed?método nos after_*callbacks, verá um aviso como:
AVISO DE DEPRECAÇÃO: O comportamento de attribute_changed?dentro de após retornos de chamada será alterado na próxima versão do Rails. O novo valor de retorno refletirá o comportamento de chamar o método depois de saveretornado (por exemplo, o oposto do que ele retorna agora). Para manter o comportamento atual, use em seu saved_change_to_attribute?lugar. (chamado de some_callback em /PATH_TO/app/models/user.rb:15)
Como ele menciona, você pode corrigir isso facilmente, substituindo a função por saved_change_to_attribute?. Então, por exemplo, name_changed?torna-se saved_change_to_name?.
Da mesma forma, se você estiver usando o attribute_changepara obter os valores antes e depois, isso também muda e gera o seguinte:
AVISO DE DEPRECAÇÃO: O comportamento de attribute_changedentro de após retornos de chamada será alterado na próxima versão do Rails. O novo valor de retorno refletirá o comportamento de chamar o método depois de saveretornado (por exemplo, o oposto do que ele retorna agora). Para manter o comportamento atual, use em seu saved_change_to_attributelugar. (chamado de some_callback em /PATH_TO/app/models/user.rb:20)
Novamente, como mencionado, o método altera o nome para o saved_change_to_attributequal retorna ["old", "new"]. ou use saved_changes, que retorna todas as alterações, e essas podem ser acessadas como saved_changes['attribute'].