2011-04-04 11 views
28

El uso de la gema OmniAuth, me veo obligado a definir una sola devolución de llamada ruta para las conexiones exitosas, independientemente del proveedor:Rieles: Procesar y salga inmediatamente

def auth_callback 

     auth_data = request.env['omniauth.auth'] 

     if auth_data.has_key('something') 
      process_one(auth_data) 
     else 
      process_two(auth_data) 
     end 

     # No view is available here 

end 


def process_one 
    # do something then render view for process_one 
    return 
end 

def process_two 
    # do something then render view for process_two 
    return 
end 

¿Cómo puedo evitar que el controlador de regresar a la auth_callback método y tratar de mostrar la vista correspondiente (que no existe)? El tratamiento debe considerarse como completo una vez que el proceso_un o proceso_dos métodos han regresado.

+0

¿Tiene rutas de código en sus métodos 'process_one' y' process_two' que no devuelve nada? Si es así puedes intentar renderizar: nothing => true u otra cosa allí –

+0

Podría usar "if (x) render: process_one else render: process_two" en auth_callback, pero es bastante antinatural: prefiero confiar en process_one y process_two para representar sus propios puntos de vista. –

+0

Quise decir si escribes en algún lugar 'return' simple (o si tienes un código como' return if (! Something) '). Los raíles intentarán mostrar la acción predeterminada vista –

Respuesta

70

¿Por qué no llama específicamente al render en esos métodos?

def process_one 
# do something then render view for process_one 
render :process_one and return 
end 

Los raíles deben detectar que ya lo ha ejecutado y no intentar volver a procesar.

+0

Funciona. Pensé que Rails trataría de renderizar auth_callback incluso si ya se había invocado un renderizado. Muchas gracias. –

+0

Muy práctico para devolver desde un método de controlador (no es necesario procesar el código a continuación, generalmente después de alguna validación). Gracias :) – lboix

+0

Dado que no hay lógica después del renderizado, ¿es necesario el 'retorno' en este caso? En otras palabras, ¿está bien si el método no devuelve nada, sino que lo que devuelve 'render'? – Dennis

Cuestiones relacionadas