Comment convertir une chaîne en une méthode de classe?

Voici comment convertir une chaîne en classe dans Rails / Ruby:

p = "Post" Kernel.const_get(p) eval(p) p.constantize 

Mais que se passe-t-il si je récupère une méthode à partir d’un object tableau / enregistrement actif comme:

 Post.description 

mais ça pourrait être

 Post.anything 

où tout est une chaîne comme anything = "description" .

Cela est utile car je souhaite restructurer une très grande classe et réduire les lignes de code et les répétitions. Comment puis-je le faire fonctionner?

 Post.send(anything) 

Même si eval peut être un outil utile pour ce genre de chose, et que ceux d’autres formations peuvent l’utiliser aussi souvent qu’un ouvre-boîte, il est en fait dangereux de l’utiliser de manière aussi décontractée. Eval implique que tout peut arriver si vous ne faites pas attention.

Une méthode plus sûre est la suivante:

 on_class = "Post" on_class.constantize.send("method_name") on_class.constantize.send("method_name", arg1) 

Object # send appelle la méthode de votre choix. Vous pouvez envoyer un symbole ou une chaîne à condition que la méthode ne soit ni privée ni protégée, devrait fonctionner.

Puisqu’il s’agit d’une question de Ruby on Rails, je vais élaborer un peu.

Dans Rails 3, en supposant que title est le nom d’un champ sur un object ActiveRecord, les éléments suivants sont également valides:

 @post = Post.new method = "title" @post.send(method) # => @post.title @post.send("#{method}=","New Name") # => @post.title = "New Name" 

Essaye ça:

 class Test def method_missing(id, *args) puts "#{id} - get your method name" puts "#{args} - get values" end end a = Test.new a.name('123') 

Donc, la syntaxe générale serait a.() .