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.
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à.
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).
Vous pouvez jeter
return false
où vous voulez que l'exécution du code dans votre action s'arrête
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.
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.