Controller中的ActiveModel :: MissingAttributeError无法写入未知属性

时间:2015-08-16 21:17:04

标签: ruby-on-rails ruby activerecord backend

对于我的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是一个模型实例,但我希望将其转换为哈希并为其附加更多的键值对。

1 个答案:

答案 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