Лучше всего использовать конечный автомат и сохранять данные в базе данных между различными шагами в форме.
Вы можете сделать, например, validates_presence_of :username, :if => proc {|u| u.signup_step >= 2 }
, где signup_step
- целочисленный столбец в базе данных.
Итак, даже если вы говорите, что не хотите хранить его в базе данных между формами, я думаю, вам следует. Если вы сделаете это, вы можете использовать обычные проверки и модели, без неприятных хаков. И, честно говоря, я сомневаюсь, что сделать это таким образом - проблема.