2014-10-07 12 views
6

Devise의 SessionsController에서 destroy 메서드를 재정의하려고하는데 아직 성공하지 못했습니다. 나는 이미 create 메서드에 대해이 작업을 수행했지만, destroy 메서드에서 작동하지 않는 이유를 알지 못합니다. devise SessionsController 무시 destroy

은 내 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 

난 다음 curl 요청을 사용하는 경우, 방법을 만들이 잘 작동 :

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

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"}}' 

을하지만이를 사용할 때

나는 응답으로 <html><body>You are being <a href="http://localhost:3000/">redirected</a>.</body></html>을 얻고, puts "DELETE /resource/sign_out" 전화는 절대 발생하지 않습니다.

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) 

내 영어 당신과 죄송합니다 감사합니다

이 내가 레일에 STDOUT 출력을 얻을 것입니다!

답변

20

아마도 skip_before_action :verify_signed_out_user이 필요합니다. https://github.com/plataformatec/devise/blob/master/app/controllers/devise/sessions_controller.rb 라인 4를 살펴보십시오.

+0

고맙습니다! 그것을 해결했습니다 – DemianArdus

+1

@pragma의 주석을 명확히하기 위해 : OP는'before_filter'가 호출 되었기 때문에'destroy' 액션이 실제로 실행되지 않았다는 메시지를 보았습니다. 실제로 아무도 로그인되어 있지 않은지 확인하는 검사입니다.이 조건으로 인해 리디렉션되는 것을 피하려면이 특정 before_filter를 건너 뛰어야합니다. – sameers