对于我的rails应用程序中的一个视图,我已经设置了控制器。我想从数据库中获取所有学生的记录,并为每个学生追加额外的价值。这给了我错误:
MemoMainTesterController中的 ActiveModel :: MissingAttributeError#test_students
无法写出未知属性current_target
class MemoMainTesterController < ApplicationController
def test_students
@all_students = Student.all
@all_students.each do |student|
current = current_target(student)
previous_test_info = last_pass(student)
student[:current_target] = current[0]
student[:current_level] = current[1]
student[:current_target_string] = "Level #{current[0]} - Target #{current[1]}"
student[:last_pass] = previous_test_info[0]
student[:attempts] = previous_test_info[1]
student[:last_pass_string] = previous_test_info[2]
end
end
.
.
.
end
具体发生在student[:current_target] = current[0]
的地方。
我是否不允许在此哈希中追加额外的值? 有解决方法吗?
编辑:虽然Student.all
是一个模型实例,但我希望将其转换为哈希并为其附加更多的键值对。
答案 0 :(得分:2)
在您的情况下,student
不是Hash而是Student
模型实例。
当您致电student[:current_target]
时,您正在尝试编写学生的current_target
属性,该属性肯定不是students
表格数据库中的实际属性。因此错误。
要从包含额外数据的模型中获取哈希值,您可以考虑使用此重构:
class MemoMainTesterController < ApplicationController
def test_students
@all_students = Student.all
@students_with_steroids = @all_students.map do |student|
current = current_target(student)
previous_test_info = last_pass(student)
student_attributes = student.attributes # <= this is a hash, that you store in student_attributes hash variable
student_attributes.merge(current_target: current[0],
current_level: current[1],
current_target_string: "Level #{current[0]} - Target #{current[1]}",
last_pass: previous_test_info[0],
attempts: previous_test_info[1],
last_pass_string: previous_test_info[2])
end
end