2009-09-22 6 views
1

У меня есть список дел с 5 задачами, которые хранятся в одной записи.Как использовать переменную для доступа к имени поля объекта ruby ​​в erb? ех. Model.task _ # {variable}

Todo.task_one, Todo.task_two, etc. 

То, что я хотел бы сделать, это быть в состоянии петли по полям, как этот

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

Однако, это не работает, если я использую eval "Todo.task_#{tasks} = 'text here'", который я знаю, это не безопасно. Даже использование eval на самом деле не является решением, потому что мне нужно сделать это в представлении, используя erb, поэтому я как бы застрял.

ответ

6

Ruby полна утилиты метапрограммирования. Одна такая утилита - Object#send.

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

Другой вариант - не дать задачам дружественных человеческих имен методов.

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

Работало отлично! Благодарю. Кроме того, его можно использовать в обратном порядке: task_text = Task.send ("task _ # {task_number}") – Canuk

0

Что вы ищете метод send, что все объекты в Ruby есть. Это позволяет вам «отправить» сообщение (которое является вызовом метода в любом случае) со строкой.

Пример:

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

Это вернет все, что вернуть ваши методы задачи.