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é?
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.
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 ????????
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