2009-07-17 6 views
4

J'ai un attribut name sur un modèle Person et chaque fois que j'accède à l'attribut name, je veux que name.capitalize soit retourné.Décorer un attribut dans des rails

Faire ce qui suit à l'intérieur du modèle ne fonctionne pas,

def name 
    name.capitalize 
end 

alors quelle est l'alternative?

Répondre

0

Essayez ceci:

def name 
    self[:name].capitalize 
end 
13

Je vous suggère de créer une méthode secondaire avec votre formatteurs personnalisés.

class Person 

    def formatted_name 
    name.capitalize 
    end 

end 

Ceci est une meilleure solution par rapport à la mise en œuvre de l'écrasement par défaut parce setter et getter peut appeler lorsque la mise à jour/écriture/sauvegarde de l'enregistrement à la base de données. Je me souviens d'une fois où j'ai écrasé l'implémentation par défaut d'un attribut et chaque fois qu'un enregistrement a été enregistré, l'attribut a été mis à jour avec la valeur formatée.

Si vous voulez suivre cette voie, vous pouvez utiliser alias_method_chain ou profiter de l'héritage y compris un module externe.

class Person 

    def name_with_formatter 
    name_without_formatter.capitalize 
    end 
    alias_method_chain :name, :formatter 

end 

vous pouvez aussi remplacer le nom et appeler read_attribute(:name) à partir de votre méthode personnalisée.

def name 
    read_attribute(:name).capitalize 
end 

def name 
    self[:name].capitalize 
end 

Encore une fois, ne faites pas cela. Allez-y et créez une méthode personnalisée.

+0

Pourquoi ne pas recommander votre dernière suggestion? def nom self [: nom] .capitalize fin Look élégant, c'est juste un lecteur d'attributs. Quel est le problème? – user16455

+1

Principalement parce que certains plugins se fonde sur le nom, d'autres appelle self [: nom]. Vous pourriez vous retrouver avec des valeurs incohérentes. –

+0

Il y a un problème avec le chaînage des méthodes dans l'enregistrement actif http://onehub.com/blog/posts/decorating-activerecord-accessor-methods/ – ahmy

1

Mais arrive quand le nom est nul? Capitaliser lancera une méthode non définie pour nil :: Class si self [: nom] renvoie zéro.

Ce qui suit couvre que:

def name 
    self[:name] ? self[:name].capitalize : nil 
end 

Mais je suis d'accord que vous devez créer la méthode formatée et laissez la méthode de nom est. Ne savez jamais quand vous pourriez avoir besoin des données brutes.

FYI: la raison pour laquelle votre méthode n'a pas fonctionné était parce qu'elle provoquait, ce que j'aime appeler, une boucle d'auto-référence. Vous redéfinissez la méthode mais appelez la méthode dans la nouvelle méthode. Donc, vous devez utiliser self[:name] ou read_attribute pour accéder aux données de modèle interne.

Questions connexes