ruby on rails:控制器无法访问新添加的记录

时间:2013-05-14 13:44:22

标签: ruby-on-rails ruby

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

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

你有什么想法发生这种情况吗?

2 个答案:

答案 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')中尝试此操作,看看您的记录是否确实存在。