2012-06-30 68 views
5

我設法設置了json身份驗證。我執行下面的代碼:通過json設計失敗身份驗證返回html而不是json

class Users:: SessionsController < Devise::SessionsController 
    def create 
    respond_to do |format| 
     format.html { super } 
     format.json { 
     warden.authenticate!(:scope => resource_name, :recall => "#{controller_path}#failure") 
     render :json => {:success => true} 
     } 
    end 
    end 

    def destroy 
    respond_to do |format| 
     format.html {super} 
     format.json { 
     Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name) 
     render :json => {} 
     } 
    end 
    end 

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

這工作得很好,但在驗證失敗,失敗犯規返回JSON失敗。對於設計我有一個自定義的失敗。如果我刪除了redirect_url或完全刪除了客戶失敗,那麼身份驗證將返回帶有失敗消息的json。我的自定義故障如下:

class CustomFailure < Devise::FailureApp 
    def redirect_url 
    #return super unless [:worker, :employer, :user].include?(scope) #make it specific to a scope 
    '/' 
    end 

    # You need to override respond to eliminate recall 
    def respond 
    if http_auth? 
     http_auth 
    else 
    redirect 
    end 
end 

反正保持重定向如果一個HTML請求,並具有故障味精如果JSON請求返回一個JSON?

謝謝!

回答

5

您必須告訴看守使用該自定義失敗。

def failure 
    respond_to do |format| 
    format.html {super} 
    format.json do 
     warden.custom_failure! 
     render :json => {:success => false, :errors => ["Login Failed"]} 
    end 
    end 
end