2013-05-14 93 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')中查看您的記錄是否確實存在與否。

相關問題