ruby on rails - ejemplos - ¿Cómo detengo la ejecución del controlador después de usar redirect_to?(Usando Rails)
django (5)
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 para verificar que la fecha sea válida y verificar que la fecha no esté en el futuro.
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 alguna manera de terminar la ejecución del controlador después del redirect_to?
Las formas en que puedo pensar son lanzar una excepción después del redirect_to o devolver un valor desde check_date y marcarlo en cada acción que lo llame, 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 alguna manera agradable de hacer esto. Tenía la esperanza de que al haber llamado redirigir a los rieles reconocería que quería parar, pero eso no parece suceder.
Creo que OP está confundido acerca de la función de redirect_to
.
redirect_to
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.
Probablemente quiera usar filtros.
Si llama a su check_date
como un before_filter
en el controlador, el hecho de que sea renderizado o redirigido evitará que el controlador llame al método de acción. Termina ahí y luego.
Puedes lanzar
return false
donde quiera que la ejecución del código en su acción se detenga
También puedes 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 que poner el retorno en su propia línea (en mi humilde opinión).
redirect_to simplemente 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.