前提・実現したいこと
RailsでGoogleBooksapiを使用した書籍検索機能を作成しています。
書籍データは取得できたのですが、viewに検索結果を反映できなくて困っています。
発生している問題・エラーメッセージ
app/views/books/new.html.erb
View
1<%= form_with(url:search_path,local: true, method: :get,class: "search-form") do |search|%> 2 <%= search.text_field :keyword,placeholder: "本を探す", class: "search-input" %> 3 <%= search.submit "検索", class: "form-btn" %> 4<% end %> 5 6<% @book.each do |book| %> 7 <%= book.title%> 8<%end%>
controller
1class BooksController < ApplicationController 2 3 def search 4 @book = GoogleBook.instance.search(params[:keyword]) 5 end 6end 7
APIの処理は別クラスで分けました
lib/google_book.rb
require 'net/https' class GoogleBook include Singleton #GoogleBook.instance.メソッド名 で外部から呼び出せるようにする def initialize @uri = URI.parse 'https://www.googleapis.com/books/v1/volumes' # URIにparseする @http = Net::HTTP.new @uri.host, @uri.port # httpインスタンスを生成 @http.use_ssl = true # httpsで通信を行うようにする。指定しないとエラーする場合がある end def search(keyword) # 検索を行って配列を返すメソッド create_request(keyword) @res['items'].map do |item| info = item['volumeInfo'] { id: item['id'], title: info['title'], price: item['saleInfo']['listPrice'].nil? ? ' - ' : item['saleInfo']['listPrice']['amount'].floor.to_s, authors: info['authors'], publisher: info['publisher'], published_date: info['publishedDate'], description: info['description'], image_path: info['imageLinks']['smallThumbnail'] } end end private def create_request(keyword) # httpリクエストを投げてレスポンスを返り値とするメソッド req = Net::HTTP::Get.new @uri.path + "?q=#{keyword}" # getリクエストを生成 _res = @http.request req # httpリクエストを投げる @res = JSON.parse(_res.body) # レスポンスをRubyで扱えるようにparseでhashに変換 end end
補足情報(FW/ツールのバージョンなど)
Rails 6
Ruby 3.0.1
回答1件
あなたの回答
tips
プレビュー