2013-05-14 50 views
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)

显然战绩似乎并没有被发现...

你有什么线索为什么发生这种情况?

+0

您正在使用哪个版本的Rails? – 2013-05-14 13:55:28

+0

我使用版本3.2.13。 – eg141840 2013-05-14 14:01:03

回答

4

首先,不要叫你的模型Object:这可能会造成灾难性的后果,因为Object几乎是Ruby中每个对象的基类。

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

可以在某种程度上这是不容易出错做到这一点:

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状态码的好处,但在其它方面相同的方式起作用。

+0

非常感谢,现在就像魅力一样。 – eg141840 2013-05-14 14:04:04

+0

@ eg141840没问题:) – 2013-05-14 14:04:35

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')中查看您的记录是否确实存在与否。