Voici, un before_filter
:
class ThingController < ApplicationController
before_filter :check_stuff, :if => proc {Rails.env.production?}
end
Lors d'une récente révision du code, on m'a demandé, "Est-ce que le proc
est nécessaire pour que cela fonctionne?" La réponse semble être 'oui', mais c'est une question raisonnable, et j'avais l'intention d'y répondre en me référant aux Rails documents ou guides ou quelque chose sur l'utilisation des conditions avec before_filter
(maintenant un alias de before_action
).
Je n'en ai pas trouvé. Le Action Controller Guide mentionne :only
/:except
, mais non :if
/:unless
.
À défaut, y a-t-il quelque part dans le code que je peux signaler qui couvre cela? Il est mentionné brièvement ici , mais c'est plus sur la façon dont :only
et :except
sont traités, plutôt que :if
ou :unless
.
Trouvé sur Rails Guides: http://guides.rubyonrails.org/active_record_callbacks.html#conditional-callbacks
Il s'avère qu'un Proc
n'est pas toujours requis pour qu'il fonctionne.
les
:if
et:unless
options, qui peuvent prendre un symbole, une chaîne, unProc
ou unArray
.
Donc, dans votre cas, vous pourriez probablement vous en sortir
before_action :check_stuff, if: "Rails.env.production?"
Trouver des choses dans Rails peut parfois être difficile, mais au moins des questions comme celle-ci rendent les choses plus faciles à trouver dans le temps car StackOverflow est bien indexé et a des classements de recherche élevés.
À partir de Rails 5.2 en avant, la réponse actuellement acceptée n'est plus valide et la transmission d'une chaîne au conditionnel échouera.
AVERTISSEMENT DE DÉPRÉCIATION: Passer la chaîne à: si et: à moins que les options conditionnelles soient obsolètes et soient supprimées dans Rails 5.2 sans remplacement).
À l'avenir, un proc est maintenant le meilleur moyen d'ajouter un conditionnel comme dans la question d'origine:
class ThingController < ApplicationController
before_action :check_stuff, :if => proc {Rails.env.production?}
end
j'ai fait cela sur mon code il y a quelque temps. J'espère que cet exemple vous aidera. Si vous pouvez utiliser l'instruction if mais cela devrait pointer vers une autre méthode comme je l'ai fait ici.
class Admin::ArticlesController < ApplicationController
before_filter :deny_access, :unless => :draft_and_admin?
def show
@article = Article.find(params[:id])
end
protected
def draft_and_admin?
Article.find(params[:id]).draft? && current_user.admin?
end
end
Je recommanderais d'utiliser Staby Lambda
class ThingController < ApplicationController
before_action :check_stuff, if: -> {Rails.env.production?}
end
ce qui est presque équivalent à la réponse d'Upvote Me.