我在我的控制器下面的方法:這個rails查詢如何在本地工作,但在Heroku上失敗?
@featured_topics = Topic.find_all_by_featured(true)
它工作正常,在當地,但是當我上傳我的網站的Heroku,它失敗了,我也得到一個NoMethodError。 「精選」是一個新的專欄,但是我上傳了必要的文件並運行了Heroku上的rake db:migrate。爲什麼它在Heroku上不起作用?該網站的其餘部分仍然有效。
我在我的控制器下面的方法:這個rails查詢如何在本地工作,但在Heroku上失敗?
@featured_topics = Topic.find_all_by_featured(true)
它工作正常,在當地,但是當我上傳我的網站的Heroku,它失敗了,我也得到一個NoMethodError。 「精選」是一個新的專欄,但是我上傳了必要的文件並運行了Heroku上的rake db:migrate。爲什麼它在Heroku上不起作用?該網站的其餘部分仍然有效。
這裏的問題是微妙的,只有當你的應用是在生產模式發生時(即當ENV['RAILS_ENV']
或ENV['RACK_ENV']
= production
),這是在Heroku默認配置。
當Rails應用程序處於production
模式時,它不會爲每個請求重新加載類定義(因爲它在development
模式下會在本地運行)。部分模型的類定義是在加載類時從數據庫列中提取的屬性。所以,如果你在production
加載一個類,然後更改數據庫,加載的類不知道該數據庫已發生變化,你會得到NoMethodError
新列。
要明白這是怎麼發生在你的情況在Heroku考慮以下序列:
Topic.find_all_by_featured
列引用
featured
列)heroku run bundle exec rake db:migrate
featured
列正確的順序,以避免這種情況是打開維護模式同時爲部署和數據庫遷移:
$ heroku maintenance:on
$ git push heroku master
$ heroku run bundle exec rake db:migrate
$ heroku maintenance:off
上同時部署和遷移確保沒有請求被處理轉向維護你的應用程序,並沒有類(具有不正確的列列表)加載。只有在db處於正確的狀態之後,你才允許請求。
你有沒有遷移正確的環境? – meagar 2013-03-14 21:23:42
@meagar,我只是跑了heroku耙db:遷移,我需要更具體嗎? – Ari 2013-03-14 21:27:07
你重新啓動你的應用程序遷移後:'Heroku的restart'? – 2013-03-14 21:27:36