nil:NilClass的未定义方法`update',即使它不为null

时间:2014-01-22 05:49:46

标签: 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)
        format.html { redirect_to update_grade_homework_path, notice: 'Homework was successfully updated.' }
      end
    end
end

我收到“Undefined method`update'”错误,但@grade是完美的对象。我通过检查验证了它。我做错了什么?

1 个答案:

答案 0 :(得分:2)

ActiveRecord :: Base没有名为update实例方法。 (嗯,实际上,it does,但它是一个私有方法,所以你不能使用@grade.update来调用它。您可能正在寻找update_attributes

@grade.update_attributes(:grade1 => 2)

(请注意,如果您使用的是Rails 3,则需要将行attr_accessible :grade1添加到模型中,否则上面的代码将抛出MassAssignmentSecurityError。)

ActiveRecord有一个名为update方法,您可以在文档here中找到该方法。

从这个例子中可以清楚地看出使用上的差异(比如你有一个模型成绩,你想为id为5的成绩设置属性“foo”为“bar”):

# 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")

话虽如此,如果错误消息确实说“ nil的未定义方法`更新”:NilClass “且@grade真的不等于nil,那么这是一个奇怪的错误,我想不出有什么可能发生的原因。尝试将update更改为update_attributes并告知我是否有效。