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 :o nly pour cibler uniquement les méthodes qui auront le before_filter, je peux mettre :except qui fait l’inverse (inclure dans toutes les méthodes à part celles listées).