EdgeRails : Nouveau routeur, protect_from_forgery et dépendances entre modules



Ecrit par Anthony Heukmes le 17 avril 2009 16:16

0 commentaire



Le chemin vers Rails 3 suit son cours et vous pouvez découvrir beaucoup de nouveautés sur GitHub ces derniers temps.

Première bonne nouvelle, Carl Lerche & Josh Peek collaborent sur un nouveau routeur (un middleware Rack, qui pourra donc être utilisé par d'autres frameworks que Rails). Selon Carl, les performances sont deux fois supérieures à celles du routeur de Merb (et donc 4x supérieures à Rails).

Plus d'informations sont disponibles sur le groupe Google de Rack.

Une autre bonne nouvelle, nous n'aurons plus besoin d'inclure un "authenticity token" dans nos requêtes Ajax écrites à la main!
Si vous chipottez avec Ajax, vous avez certainement eu le plaisir d'obtenir l'erreur "Invalid Authenticity Token" après avoir tentez d'envoyer une requête Ajax de type POST.
La solution est d'ajouter ce fameux token dans les paramètres et de votre requête ou de désactiver la vérification des attacks CSRF dans votre contrôleur en utilisant protect_from_forgery :except => :my_action.
Avec Rails 3, plus rien de cela ne sera nécessaire!

La méthode touch a également été ajoutée aux modèles ActiveRecord.
Une fois invoquée, elle sauvera l'enregistrement courant dans la base en mettant à jour l'attribut updated_at.

Cela peut également être utilisé en combinaison avec une association de type belongs_to.
Lorsque l'instance est sauvée/supprimée, le champs updated_at de l'enregistrement associé sera donc lui aussi "touched".


belongs_to :company, :touch => true


Si vous suivez l'évolution du code internet de Rails, vous avez probablement été surpris par des mots-clés tels que setup, depends_on ou encore use.
Vous pouvez voir un exemple dans ce commit.

Le code source peut être trouvé dans ActiveSupport (activesupport/lib/active_support/core_ext/module/setup.rb) :


class Module
attr_accessor :_setup_block
attr_accessor :_dependencies

def setup(&blk)
@_setup_block = blk
end

def use(mod)
return if self < mod

(mod._dependencies || []).each do |dep|
use dep
end
# raise "Circular dependencies" if self < mod
include mod
extend mod.const_get("ClassMethods") if mod.const_defined?("ClassMethods")
class_eval(&mod._setup_block) if mod._setup_block
end

def depends_on(mod)
return if self < mod
@_dependencies ||= []
@_dependencies << mod
end
end


Il s'agit d'une façon beaucoup plus propre de gérer l'inclusion et les dépendances des modules. Yehuda Katz a écrit un article à ce sujet.
Bookmark and Share

Ajouter un commentaire



0 commentaire pour cet article