Wie kann ich eine Variable verwenden, um den Feldnamen eines Ruby-Objekts in erb zugreifen? Ex. Model.task _ # {variable}
-
13-09-2019 - |
Frage
Ich habe eine To-do-Liste mit fünf Aufgaben, die auf dem gleichen Datensatz gespeichert werden.
Todo.task_one, Todo.task_two, etc.
Was würde ich tun, ist eine Schleife durch die Felder wie diese in der Lage sein,
total_tasks = ["one", "two", "three", "four", "five"]
for tasks in total_tasks
Todo.task_#{tasks} = "text here"
end
Dies ist jedoch nicht funktioniert, wenn ich eval "Todo.task_#{tasks} = 'text here'"
verwenden, die ich weiß nicht sicher ist. Selbst mit eval
nicht wirklich die Lösung ist, weil ich dies in der Ansicht tun muß, erb
verwenden, so dass ich bin ein bisschen fest.
Lösung
Ruby ist voll von metaprogramming Utilities. Ein solches Programm ist Object#send
.
["one", "two", "three", "four", "five"].each do |task|
Task.send("task_#{task}=", "text here")
end
Ein andere Möglichkeit ist es, nicht den Aufgaben menschliche freundliche Methode Namen geben.
5.times do |i|
Task.tasks[i] = "foo"
end
Andere Tipps
Was Sie suchen ist die senden Methode, die alle Ruby-Objekte haben. Es ermöglicht Ihnen, ‚Senden‘ eine Nachricht (die, was Aufruf ist eine Methode wirklich sowieso ist) mit einem String.
Beispiel:
Todo.send("task_#{tasks}")
Es wird wieder, was Ihre Aufgabe Methoden zurück.