У меня есть модель User с тремя полями: электронная почта,: display_name и: handle. Дескриптор создается за кулисами из: display_name.
Я использую следующие проверки:
validates :display_name, :presence => :true, :uniqueness => { :message => "Sorry, another user has already chosen that name."}, :on => :update
validates :email, :presence => :true, :uniqueness => { :message => "An account with that email already exists." }
Я использую ручку как to_param
в модели. Если пользователь не проходит проверку, отправив: display_name, которое уже существует, затем пытается изменить его и повторно отправить форму, Rails, кажется, использует новый дескриптор в качестве проверки для электронной почты - другими словами, он предполагает, что электронная почта не не принадлежат текущему пользователю, и проверка по электронной почте не проходит. На этом этапе Rails предполагает, что измененное отображаемое имя / дескриптор используется для поиска, а действие обновления вообще не может быть выполнено, потому что не может найти пользователя на основе нового дескриптора.
Вот метод обновления:
def update
@user = User.find_by_handle(params[:id])
@handle = params[:user][:display_name]
@user.handle = @handle.parameterize
...
end
Эта проблема не возникает, когда сначала происходит сбой проверки на дублирующемся электронном письме, поэтому я предполагаю, что это что-то вроде того, как я написал метод обновления - может быть, мне стоит попробовать установить маркер в модели?