2014-10-07 9 views
6

Próbuję przesłonić metodę niszczenia od Devise'a SessionsController, ale nie miałem jeszcze żadnych sukcesów. Już zrobiłem to dla metody create, ale nie wiem, dlaczego nie działa dla metody destroy.Nadpisywanie danych SessionsController destroy

To jest mój SessionsController:

module Api 
    module V1 
    class SessionsController < Devise::SessionsController 
     skip_before_filter :verify_authenticity_token, if: :json_request? 

     def create 
     resource = warden.authenticate!(:scope => resource_name, :recall => "#{controller_path}#failure") 
     resource.update_token 
     sign_in_and_redirect(resource_name, resource) 
     end 

     def sign_in_and_redirect(resource_or_scope, resource=nil) 
     scope = Devise::Mapping.find_scope!(resource_or_scope) 
     resource ||= resource_or_scope 
     sign_in(scope, resource) unless warden.user(scope) == resource 
     return render :json => {:success => true} 
     end 

     # DELETE /resource/sign_out 
     def destroy 
     puts "DELETE /resource/sign_out" 

     return render :json => {:success => true} 
     end 

     def failure 
     return render :json => {:success => false, :errors => ["Login failed."]} 
     end 

     protected 

     def json_request? 
     request.format.json? 
     end 
    end 
    end 
end 

Jeśli używam następujący curl wniosek, stworzyć metodę działa dobrze:

curl -X POST -H "Accept: application/json" -H "Content-Type: application/json" http://localhost:3000/users/sign_in -d '{"user":{"email":"[email protected]", "password":"TopTier2011"}}' 

Ale kiedy używam tego:

curl -X DELETE -H "Accept: application/json" -H "Content-Type: application/json" http://localhost:3000/users/sign_out 

Otrzymuję odpowiedź <html><body>You are being <a href="http://localhost:3000/">redirected</a>.</body></html>, a puts "DELETE /resource/sign_out" połączenie nigdy się nie dzieje.

To co mam w Rails STDOUT wyjściowe:

Started DELETE "https://stackoverflow.com/users/sign_out" for 127.0.0.1 at 2014-10-07 14:51:40 -0200 
Processing by Api::V1::SessionsController#destroy as JSON 
    Parameters: {"session"=>{}} 
[deprecated] I18n.enforce_available_locales will default to true in the future. If you really want to skip validation of your locale you can set I18n.enforce_available_locales = false to avoid this message. 
Redirected to http://localhost:3000/ 
Filter chain halted as :verify_signed_out_user rendered or redirected 
Completed 302 Found in 278ms (ActiveRecord: 0.0ms) 

dziękuję i przepraszam za mój angielski!

Odpowiedz

20

Prawdopodobnie musisz skip_before_action :verify_signed_out_user. Spójrz na https://github.com/plataformatec/devise/blob/master/app/controllers/devise/sessions_controller.rb wiersz 4.

+0

Dziękujemy! To rozwiązało: – DemianArdus

+1

Aby wyjaśnić komentarz @pragma: OP zobaczył komunikat mówiący, że akcja 'destroy' nie została uruchomiona, ponieważ wywołano' before_filter'. Jest to sprawdzenie, czy w rzeczywistości nikt nie jest zalogowany. Aby uniknąć przekierowania z powodu tego warunku, musisz pominąć ten konkretny 'before_filter' – sameers

Powiązane problemy