我有这样的控制器动作:
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是完美的对象。我通过检查验证了它。我做错了什么?
答案 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
并告知我是否有效。