30805


LINE Botをつくりたく、下記RubyプログラムをHerokuのURLにアクセスするという形で実行したところ、

[code]

    callback.rb:19:in `<main>': undefined method `[]' for nil:NilClass (NoMethodError)
    
[/code]

とのエラーが発生しました。  
どのメソッドが未定義？Nil?なのでしょうか。そして、どうすれば解決するのでしょうか。

いっぽうLINE側のWebhook URLにherokuのurlを登録してVERIFYすると、

[code]

    A http status of the response was '503 Service Unavailable'.
    
[/code]

というエラーが返ってきます。  
これは上のundefined methodエラーが原因なのでしょうか？

ソースコードはこのサイトを参考にしました。  
<http://qiita.com/mix_dvd/items/b0065d9adb8f486838c4>

[code]

    #!/usr/local/bin/ruby
    # encoding: utf-8
    
    # ライブラリの読込
    require 'cgi'
    require 'json'
    require 'line/bot'
    
    # CGIの生成
    $cgi = CGI.new()
    
    # 送信されたデータの整形
    params = {}
    $cgi.params.each {|key, val|
      params = JSON.parse(key)
    }
    
    # 返信に必要な情報の取得
    replyToken = params["events"][0]["replyToken"]
    msgType = params["events"][0]["message"]["type"]
    
    if msgType == "sticker" then
      msgText = "イイね！"
    else
      msgText = params["events"][0]["message"]["text"]
    end
    
    # 返信データの作成
    message = {
      type: 'text',
      text: msgText
    }
    
    # データ送信
    client = Line::Bot::Client.new { |config|
        config.channel_secret = "[自分のチャンネルシークレットを入力]"
        config.channel_token = "[自分のチャンネルトークンを入力]"
    }
    response = client.reply_message(replyToken, message)
    #p response
    
    # 初期認証用コード
    puts <<EOF
    Content-type: text/html
    
    linebot
    EOF
    
[/code]


CC BY-SA 3.0
2016-11-30T23:53:46.727
30800
2016-12-01T08:23:33.370
2016-12-01T00:26:30.857
18443
18443
question
ruby
undefined method `[]' for nil:NilClass (NoMethodError)


LINE Botの仕様は存じませんが、

>
[code]

>     callback.rb:19:in `<main>'
>  
[/code]

ということですので19行目を見ると、

>
[code]

>     replyToken = params["events"][0]["replyToken"]
>  
[/code]

エラーメッセージを見ると、

>
[code]

>     undefined method `[]' for nil:NilClass (NoMethodError)
>  
[/code]

ということなので、 `nil` に対して、定義されていないメソッド `[]` を使用してしまったということです。`[]`
がいくつも登場していますので、ここでは、

`params` が `nil` か( ここに対して `["events"]` で `[]` メソッドを使用している)  
`params["events"]` が `nil` か( ここに対して `[0]` で `[]` メソッドを使用している)  
`params["events"][0]` が `nil`( ここに対して `["replyToken"]` で `[]` メソッドを使用している)

の可能性がありますね。

ここで気になりましたが、

>
[code]

>     params = {}
>     $cgi.params.each {|key, val|
>       params = JSON.parse(key)
>     }
>  
[/code]

`each` のなかでせっかく初期化した `params` そのものに毎回代入しています。このため、意図した形の `params`
が出来ていないのではないでしょうか。

もしかしたら、正しい代入は `params[key] = JSON.parse(key)` なのでは?


CC BY-SA 3.0
2016-12-01T03:00:26.847
30805
2016-12-01T08:23:33.370
2016-12-01T08:23:33.370
17037
17037
30800
answer