05-09-2009, 04:21 PM
En ce qui me concerne, j'utilise les divers moyens de cache mis à disposition par Ruby on Rails. Je vais les lister et expliquer rapidement.
Tout d'abord, le page caching, qui consiste simplement à créer physiquement un fichier HTML qui sera rendu quand on appellera un contrôleur (et le code de l'action sera ignoré !).
Ici, l'action index sera appelée une fois, puis la page rendue sera stockée dans /public/users/index.html et sera rendue à chaque fois qu'on ira sur la page application.com/users/index .
On peut faire expirer le cache grâce à la ligne :
Notez qu'on peut également conditionner le cache, ainsi, dans l'exemple qui suit, on ne rend le cache que pour les requêtes qui demandent du XML en rendu :
Il existe également le action caching, qui ressemble au page caching à la différence prêt qu'il interroge tout de même le serveur en exécutant les éventuels filtres.
Ici, on met en cache l'action show, mais on effectue quand même le test d'authentification.
Là encore, on peut conditionner le cas dans lequel on rend le cache.
Notez qu'avec ces caches, le layout (c'est à dire ce qui englobe la vue rendue) est également mis en cache. En passant l'option :layout => false, on peut empêcher ce comportement, c'est d'ailleurs ce que l'on fait si ce layout contient des informations dynamiques, comme le nom de l'utilisateur courant.
J'fais une pause, j'expliquerai les sweepers, memcache, le fragment caching, etc. plus tard (et je foutrais ça dans un article).
Sephi-Chan
Tout d'abord, le page caching, qui consiste simplement à créer physiquement un fichier HTML qui sera rendu quand on appellera un contrôleur (et le code de l'action sera ignoré !).
class UsersController < ApplicationController
caches_page :index
def index
@users = User.all
end
def show
@user = User.find(params[:id])
end
end
Ici, l'action index sera appelée une fois, puis la page rendue sera stockée dans /public/users/index.html et sera rendue à chaque fois qu'on ira sur la page application.com/users/index .
On peut faire expirer le cache grâce à la ligne :
expire_page "/users/index"
Notez qu'on peut également conditionner le cache, ainsi, dans l'exemple qui suit, on ne rend le cache que pour les requêtes qui demandent du XML en rendu :
class UsersController < ApplicationController
caches_page :index, :if => lambda { |controller| controller.request.format.xml? }
# On peut accéder à cette page via application.com/users/index
# ou par application.com/users/index.xml.
def index
@users = User.all
# On indique les formats auxquels on répond.
respond_to do |format|
format.html # On rend la vue /users/index.html.erb
format.xml # On rend rend la vue /users/index.xml.erb
end
end
end
Il existe également le action caching, qui ressemble au page caching à la différence prêt qu'il interroge tout de même le serveur en exécutant les éventuels filtres.
class UsersController < ApplicationController
# On vérifie que l'utilisateur est bien connecté, sinon
before_filter :check_authentication, :except => [ :index ]
caches_action :index
def index
# ...
end
# On accède à la page via application.com/users/1
def show
@user = User.find(params[:id])
end
protected
def check_authentication
# L'implémentation qu'on veut pour vérifier l'authentification.
# Notez qu'en général, on définit cette méthode dans le contrôleur parent
# (ici ApplicationController) afin de pouvoir en hériter dans les autres.
unless session[:user]
flash[:error] = "Vous devez être authentifié."
redirect_to new_user_session_path and return
end
end
end
Ici, on met en cache l'action show, mais on effectue quand même le test d'authentification.
Là encore, on peut conditionner le cas dans lequel on rend le cache.
Notez qu'avec ces caches, le layout (c'est à dire ce qui englobe la vue rendue) est également mis en cache. En passant l'option :layout => false, on peut empêcher ce comportement, c'est d'ailleurs ce que l'on fait si ce layout contient des informations dynamiques, comme le nom de l'utilisateur courant.
J'fais une pause, j'expliquerai les sweepers, memcache, le fragment caching, etc. plus tard (et je foutrais ça dans un article).
Sephi-Chan