

LINEbotの中でぐるなびAPIを使用して情報を所得したく、rubyのcontrollerファイルにコードを記述しているのですが、下記エラーが発生して困っています。お力添えいただけると幸いです。

# エラー文

[code]

        I, [2019-10-03T00:56:21.711041 #4]  INFO -- : [eb3f8fb8-27c3-413a-93cf-c2b167063968] Completed 500 Internal Server Error in 922ms
    2019-10-03T00:56:21.711691+00:00 app[web.1]: F, [2019-10-03T00:56:21.711621 #4] FATAL -- : [eb3f8fb8-27c3-413a-93cf-c2b167063968]
    2019-10-03T00:56:21.711762+00:00 app[web.1]: F, [2019-10-03T00:56:21.711705 #4] FATAL -- : [eb3f8fb8-27c3-413a-93cf-c2b167063968] NoMethodError (undefined method `sample' for nil:NilClass):
    2019-10-03T00:56:21.711817+00:00 app[web.1]: F, [2019-10-03T00:56:21.711765 #4] FATAL -- : [eb3f8fb8-27c3-413a-93cf-c2b167063968]
    2019-10-03T00:56:21.711880+00:00 app[web.1]: F, [2019-10-03T00:56:21.711829 #4] FATAL -- : [eb3f8fb8-27c3-413a-93cf-c2b167063968] app/controllers/linebot_controller.rb:48:in `block in callback'
    2019-10-03T00:56:21.711881+00:00 app[web.1]: [eb3f8fb8-27c3-413a-93cf-c2b167063968] app/controllers/linebot_controller.rb:28:in `each'
    2019-10-03T00:56:21.711883+00:00 app[web.1]: [eb3f8fb8-27c3-413a-93cf-c2b167063968] app/controllers/linebot_controller.rb:28:in `callback'
    
[/code]

# 該当箇所のコード

**linebot_controller.rb**

[code]

    events.each { |event|
      if event.message['text'] != nil
        place = event.message['text']　　　　 #ここでLINEで送った文章を取得
        result = `curl -X GET https://api.gnavi.co.jp/RestSearchAPI/v3/?keyid=78d2d49f3aa8747a6cc03da01cf41bdd&category_s=RSFST08008&category_s=RSFST08009&#{place}`#ここでぐるなびAPIを叩く#{place}
      else
        latitude = event.message['latitude']
        longitude = event.message['longitude']
    
        result = `curl -X GET https://api.gnavi.co.jp/RestSearchAPI/v3/?keyid=78d2d49f3aa8747a6cc03da01cf41bdd&category_s=RSFST08008category_s=RSFST08009&latitude=#{latitude}longitude=#{longitude}`　　#ここでぐるなびAPIを叩く
      end
    
      hash_result = JSON.parse result  #レスポンスが文字列なのでhashにパースする
      shops = hash_result["rest"] #ここでお店情報が入った配列となる
      shop = shops.sample #任意のものを一個選ぶ
    
      #店の情報
      url = shop["url_mobile"] #サイトのURLを送る
      shop_name = shop["name"] #店の名前
      category = shop["category"] #カテゴリー
      open_time = shop["opentime"] #空いている時間
      holiday = shop["holiday"] #定休日
    
[/code]

# 全体のコード

[code]

    class LinebotController < 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_CHANNEL_SECRET"]
          config.channel_token = ENV["LINE_CHANNEL_TOKEN"]
        }
      end
    
      def callback
        body = request.body.read
    
        signature = request.env['HTTP_X_LINE_SIGNATURE']
        unless client.validate_signature(body, signature)
          error 400 do 'Bad Request' end
        end
    
        events = client.parse_events_from(body)
    
        #ここでlineに送られたイベントを検出している
        # messageのtext: に指定すると、返信する文字を決定することができる
        #event.message['text']で送られたメッセージを取得することができる
        events.each { |event|
          if event.message['text'] != nil
            place = event.message['text']  #ここでLINEで送った文章を取得
            result = `curl -X GET https://api.gnavi.co.jp/RestSearchAPI/v3/?keyid=78d2d49f3aa8747a6cc03da01cf41bdd&category_s=RSFST08008&category_s=RSFST08009&#{place}`#ここでぐるなびAPIを叩く#{place}
          else
            latitude = event.message['latitude']
            longitude = event.message['longitude']
            puts event.message['latitude']
            puts event.message['longitude']
            puts event.message['latitude'].class
            result = `curl -X GET https://api.gnavi.co.jp/RestSearchAPI/v3/?keyid=78d2d49f3aa8747a6cc03da01cf41bdd&category_s=RSFST08008&category_s=RSFST08009&latitude=#{latitude}&longitude=#{longitude}`#ここでぐるなびAPIを叩くlatitude=#{latitude}longitude=#{longitude}
          end
          hash_result = JSON.parse(result)  #レスポンスが文字列なのでhashにパースする
          shops = hash_result["rest"] #ここでお店情報が入った配列となる
          shop = shops.sample #任意のものを一個選ぶ
          puts shop
    
          店の情報
          url = shop["url_mobile"] #サイトのURLを送る
          shop_name = shop["name"] #店の名前
          category = shop["category"] #カテゴリー
          open_time = shop["opentime"] #空いている時間
          holiday = shop["holiday"] #定休日
    
          if open_time.class != String #空いている時間と定休日の二つは空白の時にHashで返ってくるので、文字列に直そうとするとエラーになる。そのため、クラスによる場合分け。
            open_time = ""
         end
         if holiday.class != String
            holiday = ""
          end
    
          response = "【店名】" + shop_name + "\n" + "【カテゴリー】" + category + "\n" + "【営業時間と定休日】" + open_time + "\n" + holiday + "\n" + url
           case event #case文　caseの値がwhenと一致する時にwhenの中の文章が実行される(switch文みたいなもの)
          when Line::Bot::Event::Message
            case event.type
            when Line::Bot::Event::MessageType::Text,Line::Bot::Event::MessageType::Location
              message = {
                type: 'text',
                text: response
              }
              client.reply_message(event['replyToken'], message)
            end
    
          end
        } 
    
        head :ok
      end
    end
    
[/code]

`hash_result = JSON.parse result` のところまで値を所得出来ているのですが、  
`shops = hash_result["rest"]` のところで値が `nil` になりエラーが発生してしまいます。  
構文ミス等探したのですが、見つけることが出来ず困ってます。  
もしよろしければご回答いただけると幸いです。


CC BY-SA 4.0
2019-10-02T12:09:42.390
59419
2019-11-08T01:01:50.203
2019-10-03T01:01:02.833
36043
36043
question
ruby-on-rails ruby api line
Rubyでぐるなびapiを叩く際に出るNoMethodErrorを解決したい。

[code]

    result = `curl -X GET https://api.gnavi.co.jp/RestSearchAPI/v3/?keyid=78d2d49f3aa8747a6cc03da01cf41bdd&category_s=RSFST08008&category_s=RSFST08009&#{place}`#ここでぐるなびAPIを叩く#{place}
    
[/code]

外部コマンドに不備があります。 `&` を `\\&` に変更すれば動くのではないでしょうか？


CC BY-SA 4.0
2019-10-04T00:32:00.137
59444
2019-10-04T00:32:00.137
36061
59419
answer