2016-11-30 3 views
0

Je suis en train de définir une méthode dans un modèle pour simplifier les choses que je fais dans mon contrôleur comme ci-dessous:Le passage d'un nom d'attribut comme argument dans une méthode ne fonctionne pas dans Rails

modèles/jeu. rb

def build_array_for(words) 
    words.downcase.split(",") 
end 

J'appelle la méthode dans le contrôleur comme ci-dessous

games_controller.rb

@wordsArray = @game.build_array_for(red_words) 

Notez que « red_words » est un attribut de cas de jeu dont la valeur est censée être une chaîne

Quand j'appelle la méthode que je reçois:

variables locales non définies ou méthode `red_words 'pour GamesController

Si je construis la méthode que:

def build_array 
    red_words.downcase.split(",") 
end 

cela fonctionne mais puisque je l'utilise avec d'autres attributs dans le même but, cela n'aurait pas de sens.

Qu'est-ce qui me manque ici, est-ce que l'argument est passé comme une chaîne et pour une raison quelconque le nom de l'attribut n'est pas reconnu?

Répondre

1

Si vous avez besoin de construire ensemble pour la colonne existe, vous pouvez essayer ceci:

def build_array_for(column) 
    self[column].downcase.split(",") 
end 

Si vous voulez construire un tableau pour n'importe quelle variable d'instance quand:

def build_array_for(name) 
    self.send(name).downcase.split(",") 
end 

symbole utilisation ou la chaîne pour un paramètre:

@wordsArray = @game.build_array_for(:red_words) 
+0

Pas de chance Alex, les deux alternatives dérivent dans la même erreur – Andrew

+0

Appelez-le comme ceci '@wordsArray = @ game.build_array_for (: red_words)' –

+0

C'est génial Alex ça fonctionne très bien maintenant. Merci beaucoup pour votre aide! – Andrew

0

changer la méthode de

def build_array_for(words) 
    words.downcase.split(",") 
end 

Lorsque vous utilisez des rails self va essayer de trouver un attribut words ou méthode d'instance words pour Game objet

EDIT

Faire cela change en conséquence

games_controller.rb

@wordsArray = @game.build_array_for(red_words) 

modèles/game.rb

def build_array(red_words) 
    red_words.downcase.split(",") 
end 
+0

Le résultat est le même. Je pense que dans Ruby c'est la même chose en utilisant 'self' ou pas? Dans les deux cas, vous essayez de trouver une méthode d'instance qui prend la valeur du paramètre 'words' pour l'objet Game. Dans les deux cas j'obtiens "variable locale indéfinie ou méthode' red_words '" – Andrew

+0

Si ce n'est pas un' attribut' ou une 'association' vous devez le passer comme paramètre –

+0

assurez-vous de passer les paramètres avec l'appel de méthode et d'accepter les paramètres dans la méthode –