web-dev-qa-db-fra.com

Comment arrêter l'exécution du contrôleur après avoir utilisé redirect_to? (Utilisation de rails)

J'ai un contrôleur avec plusieurs actions qui prennent: année et: mois comme attributs de l'URL. J'ai fait une méthode privée check_date pour vérifier que la date est valide et que la date n'est pas dans le futur.

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

Existe-t-il un moyen Rails de terminer l'exécution du contrôleur après le redirect_to?

Les moyens auxquels je peux penser sont de lever une exception après le redirect_to ou de renvoyer une valeur de check_date et de la vérifier dans chaque action qui l'appelle - quelque chose comme

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

Mais je me demande s'il y a une belle façon de faire Rails. J'espérais à moitié que d'avoir appelé redirect_to Rails reconnaîtrait que je voulais arrêter, mais que ne semble pas se produire.

44
Hamish Downer

Vous souhaitez probablement utiliser des filtres.

Si vous appelez votre check_date comme un before_filter dans le contrôleur, le fait qu'il soit restitué ou redirigé empêchera le contrôleur d'appeler la méthode d'action. Ça s'arrête là et là.

36
kch

Vous pouvez également faire:

return redirect_to :action => 'index'

et

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

car il semble plus agréable que de mettre le retour sur sa propre ligne (à mon humble avis).

48
Slipp D. Thompson

Vous pouvez jeter

return false

où vous voulez que l'exécution du code dans votre action s'arrête

16
vrish88

redirect_to indique simplement Rails ce qu'il faut rendre à la fin. Rails sera confus si vous ajoutez d'autres directives render ou redirect_to après celle que vous voulez vraiment, donc juste retour du contrôleur après le redirect_to - c'est la manière 'normale' Rails de faire les choses.

7

Je pense que l'OP est confus au sujet de la fonction de redirect_to.

redirect_to redirigera à la fin de l'action. Cependant, le reste de la fonction du contrôleur s'exécutera comme d'habitude. Tout ce que vous avez à faire (tel que publié par d'autres personnes) est d'inclure un retour, comme vous devriez le faire pour tout autre appel de fonction.

2
Tristan Tao