Причина этого в том, что ExtJS JsonReader ожидает, что корень пользователя будет массивом. Это означает, что, когда он просто возвращает один пользовательский объект из ваших действий по созданию и обновлению, он не может правильно его проанализировать, поэтому не корректно обновляет модели, чтобы пометить полученные изменения, и, следовательно, удаляет грязный флаг.
Чтобы это работало, вы можете изменить формат строк в ваших действиях с рельсами следующим образом:
format.json { render :json => { :success => true, :users => [@user] } }
(обратите внимание на квадратные скобки, касающиеся однопользовательского объекта)
Это будет корректно обновлять грязные флаги.