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