sqlite3 データベースでローカルに正常に動作し、問題なくレコードを保存および取得できる Ruby on Rails アプリがあります。
postgresql データベースを使用してhttp://moviedata.herokuapp.com/のHeroku にデプロイすると、ログにレコードが記録されているように見えても、レコードが保存されません。データベースから読み取ったレコードは正常で、データは期待どおりに表示されます。
レコードを追加するための末尾のログは次のとおりです。
2012-08-21T19:51:31+00:00 app[web.1]:
2012-08-21T19:51:31+00:00 app[web.1]:
2012-08-21T19:51:31+00:00 app[web.1]: Started POST "/" for 50.53.6.156 at 2012-08-21 19:51:31 +0000
2012-08-21T19:51:31+00:00 app[web.1]: Parameters: {"utf8"=>"✓", "authenticity_token"=>"+BYQLzhrfDkUVW8UaHikHpmtGHxpeQ/yF4VByHh9m1I=", "movie"=>{"title"=>"The Running Man", "description"=>"A documentary about a public execution game show.", "year"=>"1987", "genre"=>"science fiction"}, "commit"=>"Create Movie"}
2012-08-21T19:51:31+00:00 app[web.1]: Processing by MoviesController#index as HTML
2012-08-21T19:51:31+00:00 app[web.1]: Rendered movies/index.html.erb within layouts/application (5.1ms)
2012-08-21T19:51:31+00:00 app[web.1]: Completed 200 OK in 9ms (Views: 6.7ms | ActiveRecord: 0.9ms)
2012-08-21T19:51:31+00:00 heroku[router]: POST moviedata.herokuapp.com/ dyno=web.1 queue=0 wait=0ms service=17ms status=200 bytes=3479
「heroku pg」コマンドは、レコードが追加された後、postgres データベースで同じ行数 (11) を示します。
これは、Rails と Heroku プラットフォームを学習するために作成したシンプルなアプリです。これを再現するには、http://moviedata.herokuapp.com/にアクセスして [新しいムービー] をクリックし、フォームにジャンク データを入力して [ムービーを作成] をクリックします。レコードは保存され、フロント ページのリストに表示されるはずですが、そうではありません。
postgres データベースに書き込めるようにするために、有効にする、設定する、または有効にする必要があるものはありますか? 読み取りはできるが書き込みはできないというのは、私には非常に奇妙に思えます。ログよりもトラブルシューティングに適した方法はありますか?
ローカルでは、Ruby 1.9.3、Rails、3.2.8、PostgreSQL 9.1.5、SQLite 3.7.9、Heroku Toolbelt 2.30.3 を使用しています。
編集/更新: psql を使用するようにローカル バージョンを切り替えました。また、レコードが保存されないという同じ問題が発生します。ユーザーが log_statement='all' に設定されている場合 /var/log/postgresql/posgresql-9.1.main.log にログインすると、多くの選択が示されますが、レコードの追加が試行されると、ログにはデータベースがヒットしないことが示されます。
Foreman は、投稿されているデータを次のように表示します。
22:38:03 web.1 | Started POST "/" for 127.0.0.1 at 2012-08-21 22:38:02 -0700
22:38:03 web.1 | Processing by MoviesController#index as HTML
22:38:03 web.1 | Parameters: {"utf8"=>"✓", "authenticity_token"=>"0AyxRbwl/Kgi05uI1KX8uxVUJjx9ylAA1ltdWgmunm4=", "movie"=>{"title"=>"Army of Darkness", "description"=>"A man fights the living dead using a boomstick.", "year"=>"1997", "genre"=>"horror"}, "commit"=>"Create Movie"}
22:38:03 web.1 | Movie Load (0.8ms) SELECT "movies".* FROM "movies" ORDER BY title
22:38:03 web.1 | Rendered movies/index.html.erb within layouts/application (14.9ms)
失敗したコミットは素晴らしい説明のように聞こえます。ドライバーがコミットするように設定されているかどうかを確認する方法や、コミットがいつどのように失敗したかを確認する方法はまだわかりません。
これは非常に単純なアプリケーションであり、負荷分散や複雑な構成はなく、ほとんどのコードは 'generate scaffold' コマンドによって生成されましたが、データベースがヒットする前に何らかの制約に違反している可能性は十分にあります。Foreman (または Rails) のログレベルを 11 まで上げる方法はあるのでしょうか? また、代わりに thin を使用してみましたが、log/ フォルダー内のログ ファイルを精査しましたが、上記のログ以外に何も見つかりませんでした。