我对RoR很新。起初我使用了sqlite3数据库,但将其迁移到了mysql。我的应用程序一切正常,直到我将记录添加到我的数据库。
我可以使用“irb”控制台更新我的新记录。 我的控制器中有一个函数,它是从更新记录的python脚本调用的。
这是功能:
# GET /dd_bots/update
# param name, att
def update
obj = Object.all
obj = obj.select{ |o| o.name == params[:name] }
obj[0].update_attribute(:att, params[:att])
head :ok
end
但是,此函数不会更新返回此错误的新添加的记录:NoMethodError (undefined method update_attribute' for nil:NilClass)
显然,似乎找不到记录......
你有什么想法发生这种情况吗?
答案 0 :(得分:4)
首先,不要调用模型Object
:这可能会带来灾难性的后果,因为Object
是Ruby中几乎每个对象的基类。
其次,在update_attribute
的第一个元素上调用obj
,这是一个数组。如果数组不包含任何元素,即如果没有对象的名称与传递给控制器的名称参数相同,则会出现该错误。
您可以通过不易出错的方式执行此操作:
def update
obj = Object.find_by_name(params[:name])
obj.update_attribute(:att, params[:att]) if obj
head :ok
end
如果记录存在,您可能希望抛出异常(如果不存在)。您可以通过向!
方法添加find_by_name
来执行此操作:
obj = Object.find_by_name!(params[:name]) # Could throw an ActiveRecord::RecordNotFound
这样做的好处是,如果记录不存在,则提供HTTP 404状态代码,否则会以相同的方式起作用。
答案 1 :(得分:1)
这是传统的做法。 用您的型号名称替换Object
。
def update
obj = Object.find_by_name(params[:name]
if obj
obj.update_attribute(:att, params[:att])
end
head :ok
end
这对你有用吗?
如果没有,请在erb - Object.find_by_name('whatever_name')
中尝试此操作,看看您的记录是否确实存在。