2017-08-15 55 views
0

我正在爲Rails中的日記開發一個網站,並且在我的一個網頁上有一個按降序發佈的每一個問題的列表。我還有一個選擇框供用戶按年篩選問題,因爲他們沒有名字,但希望如果問題中的文章沒有上傳到網站,它將幫助他們更快地找到他們正在尋找的內容分別。Heroku上的NoMethodError,但不是本地的

爲了創建過濾器框的選項,我提出了以下函數來返回問題的所有獨特年份的列表(問題的日期字段是問題的發佈日期,以防萬一需要上傳網站之前的舊問題)。

Issue.select("date").order('date desc').map{ |i| i.date.year }.uniq

此功能出色我自己的機器上,但是當我在Heroku(免費帳戶)部署它,當我檢查日誌提供了以下錯誤消息。

2017-08-15T15:19:42.521061+00:00 app[web.1]: Started GET "/issues" for 83.136.45.169 at 2017-08-15 15:19:42 +0000 
2017-08-15T15:19:42.522804+00:00 app[web.1]: Processing by IssuesController#index as HTML 
2017-08-15T15:19:42.524822+00:00 app[web.1]: Issue Load (0.9ms) SELECT "issues"."date" FROM "issues" ORDER BY date desc 
2017-08-15T15:19:42.525378+00:00 app[web.1]: Completed 500 Internal Server Error in 2ms (ActiveRecord: 0.9ms) 
2017-08-15T15:19:42.525925+00:00 app[web.1]: 
2017-08-15T15:19:42.525926+00:00 app[web.1]: NoMethodError (undefined method `year' for nil:NilClass): 
2017-08-15T15:19:42.525927+00:00 app[web.1]: app/controllers/issues_controller.rb:12:in `block in index' 
2017-08-15T15:19:42.525927+00:00 app[web.1]: app/controllers/issues_controller.rb:12:in `index' 

自從我上次推送以來,我沒有對數據庫做任何更改。我不知道如何進一步調試這種情況。

回答

1

該錯誤不是由heroku引起的,而是由您在heroku上的數據庫中的數據引起的。您似乎在Issue表中創建了沒有日期的記錄。

爲了避免這種情況,使用此查詢:

Issue.where.not(date: nil).select("date").order('date desc').map{ |i| i.date.year }.uniq 

我覺得上面的查詢使用Rails 5. 只能如果您使用的是以前的版本,你可以這樣做:

Issue.select("date").order('date desc').map{ |i| i.date&.year }.uniq.compact 

注意i.date&.year和緊湊。如果datenil,則&將不執行以下方法。 但是,它可能會增加nil對象的數組,導致這樣的事情:

[year1, year2, nil, year3] 

緊湊將刪除無對象,以獲取此:

[year1, year2, year3] 

的更多信息: http://mitrev.net/ruby/2015/11/13/the-operator-in-ruby/

+0

你能解釋一下'compact'的功能嗎? –

+0

@BrianMcNestry我編輯了我的答案 –

+0

事實證明'where.not'被添加到Rails 4.0中,因此最終能夠使用第一個解決方案。 &方法不起作用 –

相關問題