web-dev-qa-db-fra.com

"Proc" est-il requis avec conditionnelle before_action / before_filter?

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.

39
MrTheWalrus

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, un Proc ou un Array.

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.

59
Dennis

À 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
20
Upvote Me

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
8
jimagic

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.

0
Imran