2009-09-22 6 views
1

J'ai une liste de choses à faire avec 5 tâches qui sont stockées sur le même enregistrement.Comment puis-je utiliser une variable pour accéder au nom de champ d'un objet ruby ​​dans erb? ex. Model.task _ # {variable}

Todo.task_one, Todo.task_two, etc. 

Ce que je voudrais faire est d'être en mesure de boucle à travers les champs comme celui-ci

total_tasks = ["one", "two", "three", "four", "five"] 
for tasks in total_tasks 
Todo.task_#{tasks} = "text here" 
end 

Cependant, cela ne fonctionne pas à moins d'utiliser eval "Todo.task_#{tasks} = 'text here'" que je sais est pas sûr. Même en utilisant eval n'est pas vraiment la solution, parce que je dois le faire dans la vue en utilisant erb, donc je suis coincé.

Répondre

6

Ruby regorge d'utilitaires de métaprogrammation. Un tel utilitaire est Object#send.

["one", "two", "three", "four", "five"].each do |task| 
    Task.send("task_#{task}=", "text here") 
end 

Une autre option consiste à ne pas attribuer aux tâches des noms de méthode conviviaux.

5.times do |i| 
    Task.tasks[i] = "foo" 
end 
+0

A travaillé super! Merci. En outre, il peut être utilisé à l'envers: task_text = Task.send ("task _ # {task_number}") – Canuk

0

Qu'est-ce que vous cherchez est la méthode send que tous les objets Ruby ont. Cela vous permet d '"envoyer" un message (c'est ce que l'appel d'une méthode est en réalité) avec une chaîne.

Exemple:

Todo.send("task_#{tasks}") 

Il retournera tout retour à vos méthodes de travail.

Questions connexes