Как я могу использовать переменную для доступа к имени поля объекта ruby ​​в erb? ех. Model.task _ # {переменная} - PullRequest
1 голос
/ 22 сентября 2009

У меня есть список дел с 5 задачами, которые хранятся в одной записи.

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, так что я застрял.

Ответы [ 2 ]

6 голосов
/ 22 сентября 2009

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 голосов
/ 22 сентября 2009

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

Пример:

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

Он вернет все, что возвращают ваши методы задачи.

...