Existe-t-il un moyen dans Rails d'ignorer un before_filter si la requête est xhr?
Avec le code suivant :
class TestsController < ApplicationController
skip_before_filter :load_something, # how to skip these only
:load_something_else # if the request is xhr ?
def index
respond_to do |format|
format.html
format.js
end
end
end
Est-il un moyen de sauter avant de filtres selon si la demande est un appel javascript sans changer la :load_something
et :load_something_else
méthodes ?
Merci !
source d'informationauteur jrichardlai
Vous devez vous connecter pour publier un commentaire.
Il y avait pas de solution propre. En supposant que vous n'avez pas de contrôle sur le
before_filters
(ou ne veulent pas en changer), je laisse laskip_before_filter
et ajouter un supplément debefore_filter
qui s'exécute seulement les méthodes, si c'est unxhr
méthode.Donc quelque chose comme
La méthode décrite ici ne fonctionne que parce que la condition est global pour l'application: le conditionnel n'est évaluée que lorsque la classe est créée. Pas sur chaque demande.
[Mise à JOUR]
Il existe, cependant, d'une façon plus propre de faire de la
skip_before_filter
conditionnelle. L'écrire comme ceci:Notez également que tout
skip_before_filter
est encore complètement pris en charge, et pas obsolète, puisque les rails 4 la documentation semble préférer l' (identiques)skip_before_action
. Aussi la documentation est pas totalement clair à ce sujet, a dû vérifier dans le code.Essayez ceci pour éviter le filtrage par une condition:
Pour ruby-2.0 vous pouvez également utiliser les lambdas (qui ont une rigueur dans l'argumentation en passant):
ou avec un argument:
Toutes ces réponses prennent la mauvaise approche, à mon avis. À l'aide d'un skip_before_action avec une condition, c'est de le faire à l'envers, et n'est pas aussi explicite et clair que l'ajout de la condition de la before_action lui-même; c'est donc ma proposition:
De cette façon, à quelqu'un de lire votre code, il est immédiatement clair dans quelles conditions cette before_action fonctionne ou ne fonctionne pas, sans avoir à compter sur eux passe à travers cette skip_before_action quelque part dans le contrôleur de la hiérarchie.
Utilisation
alias_method_chain
pour décorer les filtres, de sorte qu'ils ne sont pas exécutées si la demande est xhr.(changement
load_something
dans tout ce qui est nécessaire, la_with_
et_without_
littéral, et le suffixenoxhr
doit être la même que vous transmettez en tant que deuxième argument dans lealias_method_chain
appel.)Vous codés que les filtres? Dans ce cas, vous pouvez écrire un
if
clause à l'intérieur sans l'aide deskip_before_filter
:Dans l'autre main, vous pouvez faire votre propre filtre et d'un délégué:
Je pense que cela devrait fonctionner.