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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

0回答

226閲覧

APIを利用してる時のTypeError (no implicit conversion of String into Integer):を解決したい。

masakingu

総合スコア11

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2023/01/26 22:09

前提

サッカー選手の検索機能をAPIを利用して作成してます。
名前とseasonで検索すると、下記のようなエラーが発生しました。

実現したいこと

エラーを解決して、レスポンスをviewに表示させたいです。
アドバイスの程宜しくお願いします。

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

エラーメッセージ

Started GET "/players/search?season=2018&player_name=cavani&commit=%E6%A4%9C%E7%B4%A2" for ::1 at 2023-01-26 12:49:50 +0900 Processing by PlayersController#search as HTML Parameters: {"season"=>"2018", "player_name"=>"cavani", "commit"=>"検索"} {"get":"players\/seasons","parameters":[],"errors":[],"results":39,"paging":{"current":1,"total":1},"response":[1966,1972,1980,1982,1986,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023]} Completed 500 Internal Server Error in 2376ms (ActiveRecord: 151.3ms | Allocations: 10566) TypeError (no implicit conversion of String into Integer): app/controllers/players_controller.rb:76:in `[]' app/controllers/players_controller.rb:76:in `search'

該当のソースコード

players_controller.rb

class PlayersController < ApplicationController require 'uri' require 'net/http' require 'openssl' require 'json' before_action :set_q, only: %i[search] def index @players = Player.all end def show end def new #@results = @q.result #url = URI.parse("https://v3.football.api-sports.io/players?id=276&season=2019") #urI = URI.parse("https://media.api-sports.io/football/players/{player_id}.png") end def edit end def update respond_to do |format| if @player.update(player_params) format.html { redirect_to player_url(@player), notice: "Player was successfully updated." } format.json { render :show, status: :ok, location: @player } else format.html { render :edit, status: :unprocessable_entity } format.json { render json: @player.errors, status: :unprocessable_entity } end end end def destroy @player.destroy respond_to do |format| format.html { redirect_to players_url, notice: "Player was successfully destroyed." } format.json { head :no_content } end end def search if player_name = params[:player_name] if season = params[:season] url = URI.parse("https://api-football-v1.p.rapidapi.com/v3/players/seasons") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true http.verify_mode = OpenSSL::SSL::VERIFY_NONE request = Net::HTTP::Get.new(url) request["x-rapidapi-host"] = 'api-football-v1.p.rapidapi.com' request["x-rapidapi-key"] = APIKEY response = http.request(request) puts response.read_body result = JSON.parse(response.read_body) if result["response"] #⏬の部分でエラー発生 @player_name = result["response"][0]["player"]["name"] @season = result["response"][0]["statistics"][0]["league"]["season"] @team = result["response"][0]["statistics"][0]["team"]["name"] @age = result["response"][0]["player"]["age"] @natinality = result["response"][0]["player"]["nationality"] end end end end private def set_q @q = User.ransack(params[:q]) end # Use callbacks to share common setup or constraints between actions. def set_player @player = Player.find(params[:player_id]) end # Only allow a list of trusted parameters through. def player_params params.require(:player).permit(:player_name, :season) end def search_params params[:q]&.permit(:player_name, :season) end end

search.html.erb

<div class="container"> <div class="row"> <div class="col-lg-8 offset-lg-2"> <div class="player"> <%= form_with url: search_players_path, method: :get, local: true do |f| %> <div class="form-group"> <h1>プレイヤー検索</h1> <%= f.text_field :season, class: 'form-control', placeholder: '西暦を入力してください(例: 1997)' %> <div class="search2 "> <%= f.text_field :player_name, class: 'form-control', placeholder: '選手名を入力してください' %> <%= f.submit '検索', class: 'btn btn-primary' %> </div> </div> <% if @player_name.present? %> <%= render 'players/player' %> <% end %> <% end %> </div> </div> </div> </div>

_player.html.erb

<div class="container"> <div class="row"> <div class="col-lg-8 offset-lg-2"> <h1>player</h1> <div> <% if @player_name.present? %> <table> <tr> <td>プレイヤー名</td> <td><%= @player_name %></td> </tr> <tr> <td>西暦</td> <td><%= @season %></td> </tr> <tr> <td>チーム名</td> <td><%= @team%></td> </tr> <tr> <td>年齢</td> <td><%= @age%></td> </tr> <tr> <td>国籍</td> <td><%= @natinality%></td> </tr> </table> <% end %> </div> </div> </div> </div>

ここにより詳細な情報を記載してください。
API :https://www.api-football.com/documentation-v3#tag/Players

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

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

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

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

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

winterboum

2023/01/26 23:16

if result["response"] の直後に、 result["response"] の中身を確認すると、原因がわかりますよ
tabuu

2023/01/26 23:32

APIのresponseは数値の配列のようです。 データを確認してみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問