Ruby on rails 未定义的方法`更新';对于nil:NilClass,即使它不是null

Ruby on rails 未定义的方法`更新';对于nil:NilClass,即使它不是null,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,我有这样一个控制器动作: def update_grade @id = params[:id] @grade = "Grade#{@id}".classify.constantize.find_by_id(params[:grade_id]) # render :text => @grade.grade1.inspect respond_to do |format| if @grade.update(:grade1 => 2)

我有这样一个控制器动作:

def update_grade
    @id = params[:id]
    @grade = "Grade#{@id}".classify.constantize.find_by_id(params[:grade_id])
    # render :text => @grade.grade1.inspect
    respond_to do |format|
      if @grade.update(:grade1 => 2)
        format.html { redirect_to update_grade_homework_path, notice: 'Homework was successfully updated.' }
      end
    end
end

我得到了“未定义的方法‘更新’”错误,但@grade是一个非常好的对象。我通过检查来验证它。我做错了什么?

ActiveRecord::Base没有名为
update
的实例方法。(事实上,这是一个私有方法,所以不能使用
@grade.update
)调用它)。您可能正在查找
更新\u属性

@grade.update_attributes(:grade1 => 2)
(请注意,如果您使用的是Rails 3,则需要将行
attr_accessible:grade1
添加到您的模型中,否则上述代码将抛出MassaSignmentSecurityError。)

ActiveRecord确实有一个名为
update
的类方法,您可以在文档中找到它

从这个例子中应该可以清楚地看出使用上的差异(假设您有一个模型等级,并且希望将id为5的等级的属性“foo”设置为“bar”):


这就是说,如果错误消息真的说“未定义的方法‘update’for nil:NilClass”并且
@grade
真的不等于
nil
,那么这是一个奇怪的错误,我想不出它会发生的任何原因。尝试将
update
更改为
update\u attributes
,并让我知道是否有效。

您是如何检查它的?使用该选项,render:text=>@grade.grade1.inspect检查
@grade.grade1.inspect检查什么是
@grade.grade1.inspect
输出?也许更多的错误消息会有所帮助。您确定@grade是您期望的对象类型吗?(从代码中)看起来您可能有大量的型号,称为
Grade1
Grade2
等等。是这样吗?那么
@grade.inspect
的输出是什么?另外,请尝试渲染
@grade.class
,并告诉我您看到了什么。
# Using the class method "update":
Grade.update(5, foo: "bar")

# Using the instance method "update_attributes"
@grade = Grade.find_by(id: 5) # Or just Grade.find(5)
@grade.update_attributes(foo: "bar")