Le Filter est au Controller ce que le Partial est au View : une manière d’éviter de se répéter.
Constat
Dans mon Controller posts_controller.rb je vois ça :
class PostsController < ApplicationController # def show @post = Post.find(params[:id]) end def edit @post = Post.find(params[:id]) end def update @post = Post.find(params[:id]) end def destroy @post = Post.find(params[:id]) end end
La même ligne se répète dans plusieurs méthodes différentes.
Solution : un Filter
La solution est de rajouter un Filter, qui prend la forme d’une méthode privée que les autres méthodes vont pouvoir inclure au début du bloc. On supprime @post = Post.find(params[:id]) de toutes les méthodes et on rajoute :
class PostsController < ApplicationController before_filter :find_post, :only => [:show, :edit, :update, :destroy] #Toutes mes méthodes où je vire la ligne dupliquée private def find_post @post = Post.find(params[:id]) end end
Les before_filter sont exécutés avant le code du bloc en question. Par exemple, si j’appelle la méthode destroy, avant d’exécuter le code du bloc destroy, j’exécute la méthode find_post.
En complément, il existe des after_filter et des around_filter (mais je sais pas trop comment il fonctione ce dernier).
Dernière chose : au lieu de mettre pour cibler uniquement les méthodes qui auront le
nlybefore_filter, je peux mettre :except qui fait l’inverse (inclure dans toutes les méthodes à part celles listées).
Flux RSS