未定义的方法错误

时间:2010-02-05 13:01:46

标签: ruby-on-rails ruby

我编辑了这条消息,以实现邋and和变化。

def student_test
@student = Student.for_test.find(params[:id]) if params[:id]
@student ||= Student.new
run_sequence :testize
end

def test_finalize
Student.transaction do
if (params[:student]) and @student.update_attributes(params[:student])
  @student.test!
end

room = Room.new(:room_num => 5)
room.save

book = @student.books
book.id_num = room.id
book.save
end
end

这会返回以下错误消息: 未定义的方法`id_num ='

这是因为有超过1本书记录被传入书中吗?

有什么建议吗?谢谢。

3 个答案:

答案 0 :(得分:2)

假设学生与Book有一个has_many关系,那么@ student.books将返回一系列图书记录,因此您需要以下内容:

books = @student.books
books.each do |book|
  book.id_num = room.id
  book.save
end

答案 1 :(得分:1)

你的风格难以置信。我试着清楚一点我能做些什么。

def student_test
  @student = Student.for_test.find(params[:id]) if params[:id]
  @student ||= Student.new
  run_sequence :testize
end

def test_finalize
  Student.transaction do
    if (params[:student]) and @student.update_attributes(params[:student])
      @student.test!
    end

    room = Room.new(:room_num => 5)
    room.save

    book = @student.book
    book.id_num = room.id
    book.save
  end
end

您的主要问题是命名范围与查找程序类似 - 您不编写@student.find(:first),而是编写Student.find(:first)。同样在这里 - 命名范围用于从DB检索对象,添加条件和休息以进行查询。然后你调用finder来获取你想要的对象。

我不知道你的程序流程,但我想test_finalize是从student_test运行的,所以它可以使用@student。

答案 2 :(得分:1)

嗯,Ruby试图告诉你的是,Book类没有写入id_num属性的访问器。但是因为我们在这里谈论Active Record似乎很可能,而Book实际上指的是数据库表 - 我讨厌建议显而易见的,但是id_num是书表中的一个真实字段吗?

当然,Ruby错误可能完全没有用,还有其他事情正在发生。

也许您可以向我们展示更多背景信息?这段代码住在哪里?什么是数据结构? (哦,不希望变得粗鲁 - 请考虑缩进你的代码!)