前提
APIを使用して、サッカー選手を検索できる機能を作成しています。
固定のURIにリクエスとするとレスレスポンスは返ってきますが、
固定では無いURIにリクエストするとエラーが発生します。
実現したいこと
エラーを解決して、固定のURIにリクエストするのでは無く、名前とシーズンによって検索できるようにしたいです。
発生している問題・エラーメッセージ
名前とシーズンで検索した時のエラーメッセージ
app/controllers/players_controller.rb:60:in `search' Started GET "/players/search?season=2018&player_name=cavani&commit=%E6%A4%9C%E7%B4%A2" for ::1 at 2023-01-22 21:34:10 +0900 Processing by PlayersController#search as HTML Parameters: {"season"=>"2018", "player_name"=>"cavani", "commit"=>"検索"} Completed 500 Internal Server Error in 5ms (ActiveRecord: 0.0ms | Allocations: 2378) URI::InvalidURIError (bad URI(is not URI?): "https://api-football-v1.p.rapidapi.com/v3/players/season&search?/\#{params}"): app/controllers/players_controller.rb:60: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 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 # DELETE /players/1 or /players/1.json 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] params = URI.encode_www_form({player_name: @player_name}) #ここのURIでエラー発生 url = URI.parse('https://api-football-v1.p.rapidapi.com/v3/players/season&search?/#{params}') 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"] = ' API KEY' 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 def set_player @player = Player.find(params[:player_id]) end def player_params params.require(:player).permit(:player_name, :season) end def search_params params[:q]&.permit(:player_name, :season) end end
players_controller.rbの固定のURI
url = URI.parse('https://api-football-v1.p.rapidapi.com/v3/players?team=85&search=cavani')
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>
試したこと
paramsの部分が間違っていると思うのですが原因がわからないです。
補足情報(FW/ツールのバージョンなど)
API : https://www.api-football.com/documentation-v3#tag/Players/operation/get-players
