2012-09-20 40 views
1

我有一個簡單的rails webservice,公開了允許客戶端發佈新記錄的JSON API。處理POST時,它首先創建引用記錄,但同時也更新一些相關記錄。update_attributes在本地工作,但不會影響部署到Heroku時的更改

@foo = Foo.new(foo_params) 
if @foo.save 
    related_list = Foo.where(:some_id => foo_params[:list]) 
    related_list.each do |related| 
     # <figure out some stuff here> 
     related.update_attributes(stuff) 
    end 

    # debug spew 
    @test = Foo.find(a_related_record_id) 
    puts @test.as_json 

    format.json { render json: @foo.as_json } 
end 

我承認這是一個糟糕的兩階段提交模式,它的濫用典型的REST模式,但我繼承了這個代碼。我將最終解決它;這是階段性的「修復」計劃的一部分。

此代碼完美地在本地測試框上工作。在部署到Heroku時,我會調用debug模式,顯示在調用update_attributes之後顯然正在更新的模型。但是,不知何故,該模型並未實際更新。當我使用網頁查看「相關」記錄時,他們都沒有更新過「內容」更改。我對此感到非常困惑,因爲調試過程中似乎顯示正在更新的記錄。任何見解?

更新

有一件事我只注意到我又回到我身邊調試噴涌的是,日期時間的updated_at永遠不會改變,即使在記錄中的字段顯示有。您可以從下面的行看到,通話是在UTC時間8:04:15左右完成的。另外,我證實update_attributes返回true,所以沒有錯誤,據我所知。

之前的update_attributes被稱爲:

←[36m2012-09-20T08:04:15 + 00:00應用程式[web.1]←[0米{ 「created_at」=>星期四,9月20日2012 00:43:45 UTC +00:00,「somefield」=>「」,「id」=> 2,「updated_at」=> Thu,20 Sep 2012 06:22:07 UTC +00:00}

後update_attributes方法被稱爲:

←[36m2012-09-20T08:04:15 + 00:00 app [web.1]:←[0m {「created_at」=> Thu,20 Sep 2012 00:43:45 UTC +00:00,「somefield」=> 「10000848364」, 「ID」=> 2,「的updated_at」=>星期四,2012年9月20日6點22分07秒UTC 00:00}

+0

是不是'stuff'哈希值包含舊'updated_at'值? – khustochka

+0

好問題。不,我檢查過。 'stuff'哈希只包含'somefield'的變化,內容是正確的。 – AKhoo

+0

是否有任何形式的頁面緩存正在呈現更新記錄的視圖? – jakeonrails

回答

0

經過反覆潛心研究,我設法找出問題的根源,並修復,但我不清楚爲什麼這種情況正在發生。儘管如此,它現在已經解鎖了我,這就夠了。

在上面的代碼中,

# <figure out some stuff here> 

塊內。原來的問題中有一些代碼是我抽象出來的,因爲我認爲這些代碼是不恰當的。原來是這樣。具體而言,有一個行,其中我在做一個字符串連接:

some_string << @foo.somestringfield 

這一行,因爲某些原因,引起

related.update_attributes(stuff) 

不保存到數據庫中。這是100%可重複的(相信我,我測試了大約10次)。修復很簡單:

some_string = some_string + @foo.somestringfield 

這樣,認真地解決了這個問題。我沒有深入調查ruby內原地串聯的內核以確定根本原因,但是如果其他人遇到了這個問題,那麼現在你知道了。

0

看起來像一般這種行爲(update_attributes保存在本地,但不是在Heroku上)可以通過確保您沒有執行update_attributes調用中的函數來排除故障。

對我來說,致電update_attributes(:heartbeat => Time.now)在當地工作,未能保存在Heroku。使用上面的答案,我參加了一個猜測,並通過調用之前的update_attributes節省Time.now一個變量解決了這個問題:

heartbeat = Time.now 
thing.update_attributes(:heartbeat => heartbeat) 

此代碼在Heroku上正確保存。 這應該是一個評論,但由於聲譽規則,我在'回答'。

相關問題