web-dev-qa-db-fra.com

Comment `only:` at `before_action` fonctionne-t-il dans Rails?

Après la génération d'échafaudage, nous obtenons généralement une ligne comme celle-ci:

before_action :set_newsletter_email, only: [:show, :edit, :update, :destroy]

Quelqu'un pourrait-il m'expliquer comment fonctionne exactement ce symbole only: et en quoi il affecte la sécurité?

6
Karol Selak

L'option only de before_action définit une action OR, une liste d'actions lorsque la méthode/le bloc sera exécuté en premier.

Ex:

# defined actions: [:show, :edit, :update, :destroy]
before_action :set_newsletter_email, only: [:show, :edit]

La méthode set_newsletter_email sera appelée juste avant les actions show et edit.


L'option opposée except définit quand NE PAS exécuter la méthode/le bloc.

# defined actions: [:show, :edit, :update, :destroy]
before_action :set_newsletter_email, except: [:show, :edit]

La méthode set_newsletter_email sera appelée pour toutes les actions existantes SAUF show et edit.


only/except est simplement une sorte de liste blanche/liste noire.

11
MrYoshiji

Lorsqu'un utilisateur navigue uniquement vers ces itinéraires, il déclenchera la fonction :set_newsletter_email, généralement à la fin du fichier de contrôleur.

Ainsi, lorsque l'utilisateur accède à la méthode d'index, il ne la déclenchera pas car :set_newsletter_email est seul a appelé les méthodes entre crochets.

Dans ce cas, ce rappel est nécessaire car il définit la ressource dans les vues de ressource unique avant son rendu.

Par exemple:

/newsletter/2 route déclenchera le :set_newsletter_email qui obtiendra d'abord l'identifiant à partir des paramètres du lien, puis recherchera la ressource et définira une variable d'instance avec celle-ci.

Je ne sais pas ce qui vous préoccupe dans ce cas concernant la sécurité, mais ce rappel renvoie uniquement le paramètre id pour définir la ressource et, comme vous utilisez des échafaudages, il génère également une fonction params (également à la fin du fichier) qui liste blanche les paramètres que vous avez définis précédemment lors de la génération de l'échafaudage.

Vous pouvez trouver plus d'informations ici: http://api.rubyonrails.org/classes/AbstractController/Callbacks/ClassMethods.html

Si vous voulez que je vous explique plus ou clarifie quelque chose, il suffit de demander ????????

1
salsadeanguila

L'option :only exécute une méthode ': set_newsletter_email' dans cet exemple, lorsqu'une des actions définies dans la liste entre crochets [:show, :edit, :update, :destroy] est appelée dans le contrôleur actuel et s'exécute avant l'exécution des actions. Toute autre action définie dans le contrôleur n'exécutera pas la méthode :set_newsletter_email.

Vous pouvez également faire l'inverse avec l'option :except pour définir une méthode qui s'exécutera sur toutes les actions définies dans le contrôleur, à l'exception de celles répertoriées.

Vous pouvez également faire after_action qui sera exécuté après l'action dans le contrôleur

Vous pouvez en savoir plus sur les filtres et toutes les options ici: http://guides.rubyonrails.org/action_controller_overview.html#filters

1
meshin