2009-05-04 12 views
44

Tengo un controlador con múltiples acciones que toman: año y mes como atributos de la URL. He hecho un método privado check_date a para verificar que la fecha sea válida y verificar que la fecha no esté en el futuro.¿Cómo detengo la ejecución del controlador después de usar redirect_to? (Usando Rails)

def check_date(year, month) 
    if month < 1 || month > 12 || year < 2000 
    flash[:notice] = I18n.t 'archive.invalid_date' 
    redirect_to :action => 'index' 
    elsif year > Date.today.year || (year == Date.today.year && month > Date.today.month) 
    flash[:notice] = I18n.t 'archive.no_future' 
    redirect_to :action => 'month_index', 
     :year => Date.today.year, 
     :month => Date.today.month, 
     :type => params[:type] 
    end 
end 

¿Hay una manera de poner fin a la ejecución rieles controlador después de la redirect_to?

maneras que se me ocurren son o bien lanzar una excepción después de la redirect_to o para devolver un valor desde check_date y comprobar que en cada acción que llama - algo así como

def month_index 
    year = params[:year].to_i 
    month = params[:month].to_i 
    if !check_date(year, month) 
    return 
    ... 
end 

Pero me pregunto si hay algunas buenas maneras de hacer esto. Estaba medio esperando que al haber llamado redirect_ a los rieles reconocería que quería detenerme , pero eso no parece suceder.

Respuesta

35

Es probable que desee utilizar filtros.

Si llama a su check_date como before_filter en el controlador, el hecho de que se represente o redirija evitará que el controlador llame al método de acción. Termina ahí y luego.

+1

Esto puede resolver el problema del asker pero vine aquí esperando una solución como la de vrish88. – iphone007

6

redirect_to solo le dice a los rieles qué renderizar cuando termine. Rails se confundirá si agrega otras directivas render o redirect_to después de la que realmente desea, así que simplemente regrese desde el controlador después de la redirección_a - es la manera 'normal' de hacer las cosas.

16

Usted puede lanzar en

return false 

donde desea que la ejecución de código en su acción para detener

+4

en realidad, solo un retorno servirá. – kch

+3

sí, pero cuando está en una función privada tengo que verificar los valores de retorno, así que estaba buscando una forma más automática, como el before_filter –

+0

@HamishDowner En ese caso, definitivamente tendría la función privada devolver el estado en una forma nativa a lo que está haciendo, es decir, un símbolo si devuelve otros símbolos, un 'falso' si normalmente devolvería' verdadero', un 'nil' si normalmente devuelve otros datos, o tal vez incluso una forma de una variable de salida o una excepción si eso parece mejor para el ayudante. Luego, el controlador debería detectar sin embargo la función privada expresa el estado negativo y reaccionar a eso.Mezclar la funcionalidad del método del controlador en una función privada no solo se complica demasiado rápido, sino que dificulta la reutilización. –

47

También puede hacer:

return redirect_to :action => 'index' 

y

return redirect_to :action => 'month_index', 
    :year => Date.today.year, 
    :month => Date.today.month, 
    :type => params[:type] 

ya que se ve mejor un retorno de poner en su propia línea (en mi humilde opinión).

+0

O 'redirect_to: action => 'index' y return' – Rigo

0

Creo que el OP está confundido acerca de la función redirect_to.

redirect_to se redirigirá al final de la acción. Sin embargo, el resto de la función del controlador se ejecutará como de costumbre. Todo lo que tienes que hacer (como lo publican otras personas) es incluir una devolución, como lo harías con cualquier otra función.

Cuestiones relacionadas