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

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

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

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

Ruby on Rails 6

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

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

PostgreSQL

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

Q&A

解決済

2回答

3651閲覧

NoMethodError (undefined method `include?' for nil:NilClass):の原因が解消できない...

athlaliel

総合スコア7

LINE Messaging API

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

Ruby on Rails 6

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

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

PostgreSQL

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

0グッド

0クリップ

投稿2020/08/13 06:59

#目的

status500エラーを解決し、webhookの検証を成功させたい。

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

#####railsでlinebotを作っているが、webhookの検証がstatus500エラーで成功しない。callbackURLを記載し、検証を実行すると下記エラーが発生します。

#エラー

  • Webhookイベントオブジェクトを送信したときにエラーが発生しました

#エラー

  • ボットサーバーから200以外のHTTPステータスコードが返されました

デプロイは済んでいるのでheroku logsコマンドを打つと、ターミナルには下記エラーが出ます。NoMethodError (undefined method `include?' for nil:NilClass):。これがstatus500の原因に直結すると思っているのですが、その原因に分からないです。

2020-08-13T03:04:33.796590+00:00 app[web.1]: [277c2d75-ee0c-4c8e-9c93-ae1fd97f813b] NoMethodError (undefined method `include?' for nil:NilClass): 2020-08-13T03:04:33.796590+00:00 app[web.1]: [277c2d75-ee0c-4c8e-9c93-ae1fd97f813b] 2020-08-13T03:04:33.796591+00:00 app[web.1]: [277c2d75-ee0c-4c8e-9c93-ae1fd97f813b] app/controllers/linebots_controller.rb:30:in `block in callback' 2020-08-13T03:04:33.796591+00:00 app[web.1]: [277c2d75-ee0c-4c8e-9c93-ae1fd97f813b] app/controllers/linebots_controller.rb:27:in `each' 2020-08-13T03:04:33.796591+00:00 app[web.1]: [277c2d75-ee0c-4c8e-9c93-ae1fd97f813b] app/controllers/linebots_controller.rb:27:in `callback' 2020-08-13T03:04:33.798999+00:00 heroku[router]: at=info method=POST path="/callback" host=shinobi01bot.herokuapp.com request_id=277c2d75-ee0c-4c8e-9c93-ae1fd97f813b fwd="203.104.156.76" dyno=web.1 connect=1ms service=562ms status=500 bytes=1827 protocol=https

疑わしいソースコード部分(linebots_contoroller.rb)

入力された文章に対して特定の台詞を返したい
class LinebotsController < ApplicationController require 'line/bot' # gem 'line-bot-api' # callbackアクションのCSRFトークン認証を無効 protect_from_forgery :except => [:callback] def client @client ||= Line::Bot::Client.new { |config| config.channel_secret = ENV['LINE_BOT_CHANNEL_SECRET'] config.channel_token = ENV['LINE_BOT_CHANNEL_TOKEN'] } end def callback # Postモデルの中身をランダムで@postに格納する @post=Post.offset( rand(Post.count) ).first body = request.body.read signature = request.env['HTTP_X_LINE_SIGNATURE'] unless client.validate_signature(body, signature) head :bad_request end events = client.parse_events_from(body) events.each { |event| # event.message['text']でLINEで送られてきた文書を取得 if event.message['text'].include?("パスワード") response = "パスワードが違う!曲者め!" elsif event.message["text"].include?("退け") response = "我が剣の切れ味、身を以て知るがいい" elsif event.message['text'].include?("覚悟") response = "ふん、意気込みだけでは儂に勝てぬぞ" elsif event.message['text'].include?("姫はどこだ") response = "そんな小娘のことより、己自身の心配をせい" else response = @post.name end #if文でresponseに送るメッセージを格納 case event when Line::Bot::Event::Message case event.type when Line::Bot::Event::MessageType::Text message = { type: 'text', text: response } client.reply_message(event['replyToken'], message) end end } head :ok end end

include?メソッドが定義されていないという事ですが、def callback〜endの書き方がおかしいのかな?と思いつつも解決に至っておりません。

試したこと

①MVCなので、一応ビューファイルやモデルファイルをチェックしましたが、今回はbotという事もあり、scaffoldでほとんど生成しており手を加えていないです。

②検索エンジンでもエラー文を調べましたが、定義する場所はコントローラー内とあるのみで原因解明の糸口が見つけられないでいます。

③他の過去記事もみましたが、自分とは微妙に違う内容ばかりで結果、混乱しました。

ここがおかしいなどの指摘がありましたら指摘を頂きたく投稿しました。先人の方々の知恵をお借りしたく思います。よろしくお願い致します。

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

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

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

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

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

guest

回答2

0

「# event.message['text']でLINEで送られてきた文書を取得」
ができて居ないように見えます。
event.message の中身を確認してみてください。

投稿2020/08/13 07:49

winterboum

総合スコア23284

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

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

athlaliel

2020/08/13 11:12

コメントありがとうございます。 仰るように文書の取得が出来ていない事は、結果がnilだからだと解釈しています。 イベントメッセージの中身というのは、 case event when Line::Bot::Event::Message case event.type when Line::Bot::Event::MessageType::Text message = { type: 'text', text: response } client.reply_message(event['replyToken'], message) end この部分だと辺りを付けました。 include?メソッドにtext型(長文)は使えないのが別な方のアドバイスも通して知りました。 どの部分をstring型(短文)に直すのかハッキリ理解しきれていないので、色々とコードを弄ってみています。
winterboum

2020/08/13 13:05

event.message の中身を確認 と言ったのは、 events.each { |event| のところで、event.messageの値がなになのかを出力するなりdebugerでみるなりしてくれ、という意味です
athlaliel

2020/08/13 14:31

重ねてありがとうございます。 どうにかbotが動くようになりました。 エラーに困った際は調べたり聞いたりするだけでなく、テストチェックを実践してみます。困ったときに他の手段が浮かぶように学習を続けます。
guest

0

ベストアンサー

NoMethodError (undefined method `include?' for nil:NilClass)

NilClassinclude?メソッドは未定義です、という意味です。

event.message['text']の結果がnilになっているのが原因です。
nilに対してはNilClassクラスもしくはその上位のクラスに定義しているメソッドしか使えません。
当然そこにinclude?メソッドは存在しないのでNoMethodErrorとなります。

include?メソッドはStringに対して使っている想定だと思いますので、nilではなく、必ずStringのオブジェクトが返ってくるように修正してみてはいかがでしょうか。

投稿2020/08/13 07:19

Mugheart

総合スコア2340

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

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

athlaliel

2020/08/13 11:05

アドバイスありがとうございます。 nilClass内にinclude?がない事を理解できました。 またinclude?をstringかarrayに使うものという理解が浅かったです。 修正するために色々記述を直しているのですが、 Mugheartさんが仰っている「event.message['text']の結果がnilになっているのが原因です。」 これはどこを見て判断が出来たのでしょうか? text結果がnilという空で何もないから、望んだテキストが返ってこない事を理解しました。 しかし、修正すべき点が当てずっぽうなので、あちこちのコードを弄っても未だ修正が出来ていないという状態です。
winterboum

2020/08/13 23:25

undefined method `include?' for nil:NilClass) というエラーメッセージで include?を探すと if event.message['text'].include?("パスワード") がある。だから  event.message['text'] が nil
athlaliel

2020/08/14 01:57

if文でパスワードという言葉を使ったのがよくなかったんですね。 この言葉に反応させたいと思って入れた言葉だったので、それ以上の意図はなかったんです。 まさかそこが原因になるとは気づけていませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問