ActiveModel::MissingAttributeError 在控制器中无法写入未知属性
ActiveModel::MissingAttributeError in Controller can't write unknown attribute
对于我的 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
是一个模型实例,但我想将它变成一个散列并向其附加更多键值对。
在您的例子中,student
不是哈希而是 Student
模型实例。
当您调用 student[:current_target]
时,您正试图写入学生的 current_target
属性,这肯定不是 students
table 的数据库中的实际属性。因此错误。
要从包含额外数据的模型中获取哈希值,您可以考虑以下重构:
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
对于我的 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
是一个模型实例,但我想将它变成一个散列并向其附加更多键值对。
在您的例子中,student
不是哈希而是 Student
模型实例。
当您调用 student[:current_target]
时,您正试图写入学生的 current_target
属性,这肯定不是 students
table 的数据库中的实际属性。因此错误。
要从包含额外数据的模型中获取哈希值,您可以考虑以下重构:
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