Ignorar (desligar) Desenvolver config.reconfirmable enquanto salva o e-mail na ação de atualização

Quando você define config.reconfirmable = trueem, o config/initializers/devise.rbDevise exige que todas as alterações de e-mail sejam confirmadas por e-mail. Isso pode ser um problema quando você deseja alterar o e-mail sem enviar confirmação, por exemplo, quando o administrador edita algum usuário.

Encontrei algumas soluções antigas como user.send(:update_without_callbacks)ou user.save(:validate => false). Mas eles realmente não funcionam (o primeiro no Rails 3, o último em tudo). Então foi isso que eu fiz:

Na primeira abordagem (não recomendado), você pode desligar config.reconfirmable, atualizar atributos e ligá-lo novamente:

Devise.reconfirmable = false
user
.update_attributes(params[:user])
Devise.reconfirmable = true

A segunda abordagem (recomendada) é usar um update_columnmétodo que salva o atributo sem callbacks. Observe que este método também desativa as validações, portanto, antes de executá-lo, você deve verificar se o e-mail (e outros atributos) está correto. A ação de atualização para users_controller.rbcom essa abordagem pode ser assim:

def update
@user = User.find(params[:id])
if @user.update_attributes(params[:user])
@user.update_column(:email, params[:user][:email])
flash
[:notice] = "User was successfully updated."
redirect_to edit_admin_user_path
(@user)
else
render
:edit
end
end

A terceira solução (adicionada como comentário por Stevo – obrigado companheiro!) Agora é recomendada :

def update
@user = User.find(params[:id])
@user.skip_reconfirmation!
if @user.update_attributes(params[:user])
flash
[:notice] = "User was successfully updated."
redirect_to edit_admin_user_path
(@user)
else
render
:edit
end
end