2012-03-28 13 views
7

escribo un before_filter así:cómo responder a una llamada Ajax en before_filter

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

Sin embargo, no funciona como se esperaba. El archivo de registro muestra:

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

La función del código js es mostrar un bloque de popover que muestra el mensaje flash. pero parece que el código js no está emocionado en absoluto.

Por lo tanto, he cambiado mi manera:

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

En cambio, quiero volver a dirigir a la página de registro.

Sin embargo, todavía hay problemas. el flash no parece trabajar

¿Cómo puedo lograr mi objetivo:

cuando la petición es una llamada ajax, ejecutar código JavaScript o vienen redirect_to una nueva página. En ambas condiciones, necesito almacenar algunos mensajes en flash.

Además, el código de javascript es muy largo, así que tengo que ponerlo en un archivo. ¿Cómo puedo usar render: js para ejecutar un javascript dentro de un archivo?

Respuesta

1

Creo que en lugar de intentar representar el código de JavaScript para que el cliente lo ejecute, debe devolver una respuesta json que su cliente entenderá.

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

En sus llamadas ajax, trampa del código de estado 403, muestre el mensaje de alerta, y redirigir a la URL dada. Debería poder hacer de este un gancho estándar para un 403 (o el código de estado que parezca más apropiado) para que pueda ser tan SECO como el before_filter.

0

Creo que el uso de la redirección integrada de los rieles es lo que está buscando.

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

Esto debe redirigir y rellene el siguiente mensaje flash

Aquí está el ejemplo de la rails guides

+0

Los raíles estándar redirigir no funcionará en una llamada AJAX. – sockmonk

Cuestiones relacionadas