2009-08-21 9 views
4

http://gist.github.com/172341 (stackoverflow enfreignait la mise en forme)méthodes créées par attr_accessor ne sont pas disponibles pour les classes sous

Au nom de la méthode de cas suivant créé par l'homme ne sont pas disponibles pour garçon. Est-ce que ma compréhension correcte que les méthodes attr_accessor ne sont pas disponibles pour les sous-classes. J'ai besoin d'utiliser superclasse pour accéder à la méthode ajoutée par attr_accessor.

+0

Je viens d'essayer moi-même et cela a fonctionné - la méthode était disponible pour Boy - même si bien sûr Boy.name était nul puisque Boy n'a pas été donné un nom. Est-ce que le problème que vous voulez, c'est que Boy hérite du nom de Human plutôt que d'avoir son propre nom? – Chuck

+2

Le produit n'est plus disponible. – noumenon

Répondre

1

Qu'est-ce que vous cherchez est cattr_accessor qui résout ce problème spécifique:

http://apidock.com/rails/Class/cattr_accessor

Voici votre exemple, fixe:

class Human 
    def self.age 
    @age = 50 
    end 
    def self.age=(input) 
    @age = input 
    end 

    cattr_accessor :name 

    self.name = 'human' 
end 
class Boy < Human 
end 

puts Human.age 
puts Boy.age 
puts Human.name 
puts Boy.superclass.name 
puts Boy.name # => 'human' 
+1

'cattr_accessor' fait en sorte que toutes les classes et instances de ces classes partagent la même valeur pour la propriété. Je ne suis pas sûr que ce soit exactement le bon comportement. – Chuck

+0

Ils ont tous deux accès au même attribut, donc c'est logique. Si vous voulez déclarer une valeur différente pour la sous-classe, vous devrez probablement déclarer à nouveau cattr_accessor. – tadman

+0

J'aurais dû mentionner que j'ai résolu ce problème en utilisant cattr_accessor. Cependant, je voulais vraiment comprendre comment fonctionne attr_accessor. Ma compréhension était qu'il stocke une variable d'instance. Mais les variables instantanées sont disponibles pour les sous-classes. Donc la vraie question est pourquoi Boy.name retourne zéro. Aussi, pourquoi ne puis-je pas utiliser le bloc de code de ce site sur mon mac/FF. – Roger

1

humaine et Boy sont deux objets différents. Deux objets ne peuvent jamais partager une seule variable d'instance. Ils ont tous deux la méthode, mais la méthode va accéder à l'ivar approprié pour l'objet.

0

Rails class_attribute méthode serait mieux dans ce cas.

Rails Guide

Questions connexes