質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

1回答

1823閲覧

RoR、production環境でLINE botを動かす際、DBのテーブルにアクセスできない

jiyi-yiteng

総合スコア3

LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

0クリップ

投稿2019/08/14 03:55

編集2019/08/21 02:53

前提・実現したいこと

LINE bot(Messaging API)において、データベースからデータを取り出してリプライできるようにしたいです。

発生している問題・エラーメッセージ

linebot controllerのアクションによってデータベースからデータを取ってこようとすると、以下のようなエラーが出ます。

Completed 500 Internal Server Error in 5ms (ActiveRecord: 1.9ms) ActiveRecord::StatementInvalid (PG::UndefinedTable: ERROR: relation "posts" does not exist

次のコマンドで作成したセットを使っており、psqlでpostsテーブルが存在することは確認済みなのですが、どうしても存在しないと言われてしまいます。

$ rails g scaffold post content:text posted_at:timestamp

該当のソースコード

以下のページのcontrollers/linebot_controller.rbをほぼ丸パクして使っています。
https://qiita.com/sakakinn/items/e771f3d7732f6bb655d3

logによると、エラーが出るのは、linebot_controller.rb中の

@post=Post.offset( rand(Post.count) ).first

の行で、Postによりpostsテーブルを参照しようとして失敗しているものと思われます。

追記

postモデルは特に何もしていませんので以下のままです。

class Post < ApplicationRecord end

postsテーブルを作るmigrationは以下のようになっています。

class CreatePosts < ActiveRecord::Migration[5.2] def change create_table :posts do |t| t.string :name t.timestamps end end end

試したこと

・テーブルが存在すること、テーブル名に大文字小文字が混在しないこと、search_pathが通っていること(今回はpublic)は確認しました。
・同じproduction環境でも、ngrokを使ったローカル環境では正常に動くのに、ローカルでない環境(webhook URLに"herokuapp.com"が含まれる)だと前述のエラーが出てしまいます。
・ローカルでない環境でも、データベースを用いなければちゃんとリプライできます。

補足情報(FW/ツールのバージョンなど)

Rails 5を使用しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

8zca

2019/08/14 12:40

こんばんは。 > psqlでgorokusテーブルが存在することは確認済みなのですが テーブルが無いよと言われているのはpostsテーブルですが、ちゃんと存在しているでしょうか? railsコンソールで ActiveRecord::Base.connection.tables の結果を追記していただけますか?
jiyi-yiteng

2019/08/14 16:29

その方法は盲点でした(データベース周りのデバッグの仕方が調べてもよくわからず、苦戦していたところです)! しかし、やってみたのですがやはりあると言われます… 以下が実行内容と結果なのですが(関係ないテーブルが多くてすみません…)、psql→\dtで調べると1つしかない"gorokus"テーブルがこちらでは2つ出てくるのも理由がわかりません。 irb(main):001:0> Rails.env => "production" irb(main):002:0> ActiveRecord::Base.connection.tables => ["schema_migrations", "ar_internal_metadata", "users", "gorokus", "gorokus", "posts", "tweets", "active_storage_blobs", "active_storage_attachments"] よろしくお願いします!
jiyi-yiteng

2019/08/15 14:49

ありがとうございます、追記致しました! stackoverflowも拝見しましたが、追記内容にもあります通りforeign_keyなどは用いていませんのでそれでもなさそうです… rake db:migrateはしています。
8zca

2019/08/16 16:17

私も同様の条件でherokuにデプロイして確認してみましたが、再現はしませんでした。 $ heroku run rails c irb(main):001:0> Rails.env => "production" irb(main):002:0> ActiveRecord::Base.connection.tables => ["schema_migrations", "ar_internal_metadata", "posts"] irb(main):005:0> Post.columns.map(&:name) => ["id", "content", "created_at", "updated_at"] irb(main):007:0> Post.create(content: 'abc') irb(main):008:0> Post.offset( rand(Post.count) ).first => #<Post id: 1, content: "abc", created_at: "2019-08-16 16:10:04", updated_at: "2019-08-16 16:10:04"> 他のテーブルからpostsが参照されているということはありませんか?
jiyi-yiteng

2019/08/21 03:01

ご返信ありがとうございます!遅くなってしまい申し訳ありません! いただいたコメントの通り $ heroku run rails c irb(main):001:0>ActiveRecord::Base.connection.tables とすると => [] と帰ってきました。 heroku runというものをこれまで知らなかったので、これをキーワードに調べて $ heroku run rails db:migrate をしたところうまくいきました! 見事解決いたしまして、本当にありがとうございます!
Mugheart

2019/08/21 03:04 編集

> rake db:migrateはしています。 とのことですが、rake db:migrate したのが開発環境だけで 本番環境ではしてないとかそんな気がしますね。 本番環境というかHeroku上で。
guest

回答1

0

自己解決

$ heroku run rails c
irb(main):001:0>ActiveRecord::Base.connection.tables
=> []

となったので

$ heroku run db:migrate

をしたところ上手くいった。

投稿2019/08/21 03:03

jiyi-yiteng

総合スコア3

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問