2011-10-06 3 views
0

Dans les rails est-il possible de faire une fonction qui chaque fois qu'un attribut particulier est modifié, rails exécute une fonction. Dans mon cas, chaque fois que object.address (j'ai geocoded_by: address et after_validation: geocode) est changé, je veux faire object.geocode. Je suis sur des rails 3Rails attribut geocoder

Répondre

0

La meilleure solution, je pense, serait d'inclure ActiveModel :: sale dans votre modèle, vous pouvez le vérifier dans un rappel

class MyModel < ActiveRecord::Base 
    def after_save 
    if address_changed? do 
     #some stuff.. 
    end 
    end 
end 

voir ActiveModel::Dirty

0

Pour moi la solution la plus élégante consiste à utiliser une validation conditionnelle selon que l'attribut à géocoded_by (adresse) a changé ou non. Vous pouvez faire quelque chose comme ça dans le « after_validation » rappel du modèle que vous géocodage, ou placez-le dans tout rappel Active Record correspond à votre objectif:

after_validation :geocode, :if => lambda{ |obj| obj.address_changed?}

+0

Que faire si je veux vérifier si l'un des deux attributs a changé? – bcackerman

3

Il suffit de passer le terrain pour vérifier malpropreté en vous after_validation comme dans

after_validation :geocode, :if => :address_changed? 
+0

Que faire si je veux vérifier si l'un des deux attributs a changé? – bcackerman

+0

Il suffit de faire pointer le symbole vers une méthode où vous faites le contrôle – BSB