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