2013-03-14 54 views
0

我在我的控制器下面的方法:這個rails查詢如何在本地工作,但在Heroku上失敗?

@featured_topics = Topic.find_all_by_featured(true) 

它工作正常,在當地,但是當我上傳我的網站的Heroku,它失敗了,我也得到一個NoMethodError。 「精選」是一個新的專欄,但是我上傳了必要的文件並運行了Heroku上的rake db:migrate。爲什麼它在Heroku上不起作用?該網站的其餘部分仍然有效。

+0

你有沒有遷移正確的環境? – meagar 2013-03-14 21:23:42

+0

@meagar,我只是跑了heroku耙db:遷移,我需要更具體嗎? – Ari 2013-03-14 21:27:07

+4

你重新啓動你的應用程序遷移後:'Heroku的restart'? – 2013-03-14 21:27:36

回答

3

這裏的問題是微妙的,只有當你的應用是在生產模式發生時(即當ENV['RAILS_ENV']ENV['RACK_ENV'] = production),這是在Heroku默認配置。

當Rails應用程序處於production模式時,它不會爲每個請求重新加載類定義(因爲它在development模式下會在本地運行)。部分模型的類定義是在加載類時從數據庫列中提取的屬性。所以,如果你在production加載一個類,然後更改數據庫,加載的類不知道該數據庫已發生變化,你會得到NoMethodError新列。

要明白這是怎麼發生在你的情況在Heroku考慮以下序列:

  1. 應用程序部署瓦特/新Topic.find_all_by_featured列引用
    1. 軟件,即可通過Heroku的自動重啓
    2. 一個請求進入您的應用程序,導致類從數據庫的當前狀態加載到內存中(不包括featured列)
  2. 您運行heroku run bundle exec rake db:migrate
    1. 你在Heroku DB是更新與新featured
    2. 模型類已經在內存中的Heroku賽道是重新加載。他們仍然不知道新欄目。
  3. 你打你的應用程序。因爲在你的代碼中引用的字段是不是在它的數據庫中的列(在步驟#1加載)的列表軌拋出一個錯誤。

正確的順序,以避免這種情況是打開維護模式同時爲部署和數據庫遷移:

$ heroku maintenance:on 
$ git push heroku master 
$ heroku run bundle exec rake db:migrate 
$ heroku maintenance:off 

上同時部署和遷移確保沒有請求被處理轉向維護你的應用程序,並沒有類(具有不正確的列列表)加載。只有在db處於正確的狀態之後,你才允許請求。

相關問題