Devise - Confirmando depois que o usuário edita o email
Estou tentando descobrir isso há 2 dias. Estou confirmando contas de usuário com confirmações por e-mail (via Devise). Finalmente consegui todo esse trabalho, mas o ponto principal era validar que uma pessoa possui o e-mail que afirma ter. Portanto, preciso confirmar novamente sempre que o usuário alterar o email.
Para fazer isso, eu crieiregistrations_controller
e sobrescrevi oupdate
método. Basicamente baseado no que o Devise possui, mas verifico se preciso enviar a confirmação com base na atualizaçã
# registrations_controller.rb
def update
self.resource = resource_class.to_adapter.get!(send(:"current_#{resource_name}").to_key)
send_confirmation = false
if params[:user][:email] != resource.email
send_confirmation = true
end
if resource.update_with_password(params[resource_name])
set_flash_message :notice, :updated if is_navigational_format?
sign_in resource_name, resource, :bypass => true
if send_confirmation
resource.update_attributes(:confirmed_at => nil, :confirmation_sent_at => nil)
resource.send_confirmation_instructions
end
respond_with resource, :location => after_update_path_for(resource)
else
clean_up_passwords(resource)
respond_with_navigational(resource){ render_with_scope :edit }
end
end
Meu problema é que não tenho certeza de onde, no processo, posso mudar para onde é redirecionado. Eu tenho uma página que explica que "um email foi enviado para confirmar seu email". Mas se eu tentar colocá-lo depois desend_confirmation_instructions
quando o usuário clica em "atualizar conta", é desconectado (pressionado para a tela de login) e, quando confirma a conta por e-mail, é direcionado para a página que eu queria mostra
Tenho uma estratégia personalizada do Warden com algumas opções e também escrevi o filtro anterior que a Devise coloca:
# registrations_controller.rb
def authenticate_scope!
puts "RegistrationsController :: authenticate_scope!"
puts "action : #{params[:action]}"
super
end
Parece que está tentando autenticar o usuário. O log lê da seguinte maneira:
...
Redirected to http://localhost:3000/users/edit
Completed 302 Found in 3537ms
RegistrationsController :: authenticate_scope!
action : edit
Started GET "/users/edit" for 127.0.0.1 at 2011-06-08 11:42:09 -0500
Processing by RegistrationsController#edit as HTML
User Load (0.7ms) SELECT "users".* FROM "users" WHERE "users"."id" = 19 LIMIT 1
Completed in 83ms
Warden::Strategies authenticate!
Warden::Strategies params: {"action"=>"new", "controller"=>"sessions"}
Started GET "/users/sign_in" for 127.0.0.1 at 2011-06-08 11:42:10 -0500
Processing by SessionsController#new as HTML
...
Então, como / onde eu controlo para onde é redirecionado? Estou redefinindo corretamente os atributos de "confirmação"?