2012-03-28 5 views
7

Ich schreibe einen before_filter so antworten:wie auf einen Ajax-Aufruf in before_filter

def authenticate_user 
    if request.xhr? 
    flash.now[:alert] = 'Error' 
    render :partial => "js_helpers/popover", :formats => :js 
    else 
    authenticate_user! 
    end 
end 

Allerdings ist es nicht wie erwartet. Die Protokolldatei zeigt:

Rendered js_helpers/_popover.js.erb (0.1ms) 
Filter chain halted as :authenticate_user rendered or redirected 

Die Funktion des Js-Codes ist, einen Popover-Block anzuzeigen, der Flash-Nachricht zeigt. aber es sieht aus wie der Js-Code überhaupt nicht aufgeregt ist.

Also änderte ich meine Art und Weise:

def authenticate_user 
    if request.xhr? 
    flash.now[:alert] = 'Error' 
    render :js => "window.location = '/users/sign_up'" 
    else 
    authenticate_user! 
    end 
end 

Stattdessen möchte ich Seite um sich registrieren umleiten.

Es gibt jedoch immer noch Probleme. der Blitz scheint nicht funktioniert

Wie kann ich mein Ziel erreichen:

, wenn die Anforderung ein Ajax-Aufruf ist, führen Sie Javascript-Code kommen oder redirect_to eine neue Seite. Unter beiden Bedingungen muss ich eine Nachricht im Flash speichern.

Plus, der JavaScript-Code ist sehr lang, so dass ich es in eine Datei legen muss. Wie kann ich mit render: js ein Javascript in einer Datei ausführen?

Antwort

1

Ich denke, dass, anstatt zu versuchen, JavaScript-Code für den Client auszuführen, sollten Sie eine JSON-Antwort, die Ihr Client verstehen wird, zurückgeben.

def authenticate_user 
    if request.xhr? 
    render :json => { alert: 'Error', redirect: sign_up_path }, :status => 403 
    else 
    authenticate_user! 
    end 
end 

In Ihrer Ajax-Aufrufe, fangen die 403-Statuscode, zeigen Sie die Warnmeldung, und an die angegebene URL umleiten. Sie sollten in der Lage sein, dies zu einem Standard-Hook für einen 403 zu machen (oder welcher Statuscode auch immer am passendsten erscheint), so dass er so DRY wie der before_filter sein kann.

0

Ich denke, dass die Verwendung von Rails integrierte Umleitung ist, was Sie suchen.

def authenticate_user 
    if request.xhr? 
    flash[:alert] = 'Error' 
    redirect_to user_sign_up 
    else 
    authenticate_user! 
    end 
end 

Dies sollte

Hier die Flash Nachricht umleiten und füllen Sie das Beispiel aus dem rails guides

+0

Die Standardschienen umleitet auf einem AJAX-Aufruf nicht. – sockmonk

Verwandte Themen