2010-12-12 10 views
1

Question 1Ruby: Comment obtenir une classe basée sur le nom de la classe et comment puis-je obtenir le champ de l'objet en fonction du nom du champ?

Comment obtenir une classe avec un nom de classe sous forme de chaîne?

Par exemple, disons Product classe a la méthode do_something:

str = "product" 
<what should be here based on str?>.do_something 

Question 2

Comment obtenir le champ de l'objet donné un nom de champ comme une chaîne?

Par exemple, supposons que la classe Product a price terrain:

str = "price" 
product = Product.new 
product.<what should be here based on str?> = 1200 

Répondre

4
  1. Utilisez capitalize et constantize:

    str.capitalize.constantize.do_something 
    
  2. Utilisation send:

    product.send(str + '=', 1200) 
    
+1

'constantize' n'est pas standard Ruby, voir http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-constantize –

+1

Utilisez [' public_send'] (http: // ruby- doc.org/core/Object.html#method-i-public_send) au lieu de 'send' autant que possible pour éviter de contourner la visibilité de la méthode. –

5

La réponse de Jacob à la première question suppose que vous utilisez Rails et fonctionnera correctement si vous l'êtes. Dans le cas contraire, vous pouvez appeler le Kernel::const_get(str) pour trouver une constante existante par son nom.

send est un rubis pur. Cependant, il n'est pas nécessaire d'interposer vos chaînes avec send (les convertir en symboles), les chaînes droites fonctionnent bien.

+0

Merci pour les éclaircissements! –

Questions connexes