1

我对 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)

显然,似乎找不到记录...

你知道为什么会这样吗?

4

2 回答 2

4

首先,不要调用你的模型Object:这可能会产生灾难性的后果,就像ObjectRuby 中几乎每个对象的基类一样。

其次,update_attribute在 的第一个元素上调用obj,这是一个数组。如果数组不包含任何元素,即没有名称与传递给控制器​​的名称参数相同的对象,您将收到该错误。

您可以通过一种不易出错的方式执行此操作:

def update
  obj = Object.find_by_name(params[:name])
  obj.update_attribute(:att, params[:att]) if obj
  head :ok
end

如果记录应该存在,如果不存在,您可能希望抛出异常。您可以通过!在方法中添加 a 来做到这一点find_by_name

obj = Object.find_by_name!(params[:name]) # Could throw an ActiveRecord::RecordNotFound

如果记录不存在,这具有提供 HTTP 404 状态代码的好处,但在其他情况下以相同的方式运行。

于 2013-05-14T13:48:37.543 回答
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')并查看您的记录是否确实存在。

于 2013-05-14T13:47:49.140 回答