2017-08-15 25 views
0

私はRailsのジャーナル用Webサイトを開発しています。私のページの1つに、降順で発行されたすべての単一のissueのリストがあります。私はまた、ユーザが名前を持たないので、年々問題をフィルタリングする選択ボックスを持っていますが、うまくいけば、問題内の記事がサイトにアップロードされていないと、彼らがより迅速に探しているものを見つけるのに役立ちます別々に。NoMethodError on Herokuしかしローカルにはありません

フィルタボックスのオプションを作成するために、私は問題のすべての一意の年のリストを返すように次の関数を作成しました(問題の日付フィールドは問題の公開日ですウェブサイトの前にある古い問題をアップロードする必要があります)。

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.select("date").order('date desc').map{ |i| i.date&.year }.uniq.compact 

:私はあなたが以前のバージョンを使用している場合は、あなたがこれを行うことができ、クエリは、上記のRailsの5 でのみ動作だと思い

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

:この問題を回避するには

、このクエリを使用しますi.date&.yearとコンパクトに注意してください。 datenilの場合、&は次のメソッドを実行しません。 しかし、それはおそらくこのようなもので、その結果、あなたの配列にnilオブジェクトを追加します:コンパクト

[year1, year2, nil, year3] 

この得ることが、オブジェクトnilを削除します:

[year1, year2, year3] 

詳細情報: http://mitrev.net/ruby/2015/11/13/the-operator-in-ruby/

+0

「コンパクト」は何を説明していただけますか? –

+0

@BrianMcNestry私の回答を編集しました –

+0

Rails 4.0で 'where.not'が追加されたので、最後に最初の解決策を使用することができました。しかし、&メソッドはうまくいきませんでした。 –

関連する問題