Il se trouve que la vraie structure do ... while n'existe pas en ruby. Sérieusement.
Pour combler ce manque, il devient commun d'utiliser la structure begin...end faite pour gérer le (long)[1] code suceptible de générer une exception (plus d'informations).

Ceci ce présente donc sous la forme suivante, par exemple :

begin
  @user = User.create_guest
end while @user.errors.any?

C'est bête, mais on s'y fait, surtout quand il se trouve que l'on doit vraiment gérer des exceptions dans ce bloc.

Notes

[1] parce que c'est gérable "inline" aussi. Par exemple, si foo.bar génère une exception, avec la ligne suivante, la variable prout prendra pour valeur "pouet" : prout = foo.bar rescue 'pouet'