如何使用变量访问erb中ruby对象的fieldname?恩。 Model.task _#{}变量

时间:2009-09-22 15:36:12

标签: ruby-on-rails ruby erb

我有一个待办事项列表,其中包含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 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您正在寻找的是所有Ruby对象都具有的send方法。它允许你用一个字符串“发送”一条消息(这就是调用一个方法的方法)。

示例:

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

它将返回您的任务方法返回的任何内容。