2010-07-15 7 views
0

Je ne peux pas le faire comme ceci:question de déclaration de classe Ruby

class Hardware 

before_filter 

    def before_filter 
    puts "ge" 
    end 

end 

Il dit before_filter est méthode ou variable non définie quand j'instancier

hd = Hardware.new 

parce que Ive vu d'autres mettent un nom de méthode dans une classe avant. Je me demandais comment ça fonctionnait. Merci

Répondre

7

Il y a deux problèmes avec votre code:

  1. Vous appelez une méthode de classe, mais vous êtes en train de définir une méthode d'instance. Vous appelez la méthode avant il a été défini.

Ces deux éléments ne peuvent évidemment pas fonctionner.

Cela fonctionnerait:

class Hardware 
    def self.before_filter 
    puts "ge" 
    end 

    before_filter 
end 
+0

Juste pour clarifier: 'before_filter' obtiendrait appelé plus ou moins dès qu'il est lu, contrairement à d'autres langues qui lisent tout d'abord, puis exécute le code. Ce genre de chose signifie aussi que vous ne pouvez pas écrire une classe, puis écrire le module que vous voulez inclure. –

5

before_filter est une méthode de classe ActiveRecord (voir here) et donc ne serait disponible que si votre modèle hérité de ActiveRecord::Base (ou une sous-classe). Pouvez-vous être plus précis sur ce que vous essayez de faire?

Vous pourriez être à la recherche:

class Hardware 
    def initialize 
    super 
    before_filter 
    end 

    protected 
    def before_filter 
    # ... 
    end 
end 
3

Soit changer

def before_filter 

à

def self.before_filter 

et appelez-après défini

OU

Commentaire before_filter

class Hardware 
    def before_filter 
    puts "ge" 
    end 
end 

et APPELLENT comme

hd = Hardware.new 
hd.before_filter