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

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

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

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

Q&A

解決済

1回答

418閲覧

書籍管理アプリを作成しています。API から取得したデータを表示できず困っています。

kaji120

総合スコア39

Ruby on Rails 6

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

0グッド

0クリップ

投稿2021/05/01 07:28

編集2021/05/02 02:34

前提・実現したいこと

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

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

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

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

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

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

winterboum

2021/05/01 13:53

エラーメッセージは翻訳しないで、そのまま書いてください。
winterboum

2021/05/01 23:55

となると、BooksControllerの詳細もまずいですね、載せてください
kaji120

2021/05/01 23:58

BooksControllerはいま載せているもので全てになります。
m.ts10806

2021/05/02 01:44 編集

serch search どっちですか? 実際のコードコピペしてるなら動くと思えませんが。。
guest

回答1

0

ベストアンサー

action newが未定義 すなわち @book が未定義==nil なのでそのエラーが出ます

投稿2021/05/02 02:13

winterboum

総合スコア23329

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

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

kaji120

2021/05/02 02:47

ご回答ありがとうございます。 おっしゃる通り@bookの中身がないため発生しているエラーかと思いますが、controllerで@book = GoogleBook.instance.search(params[:keyword])としているので@bookには検索結果が入っている認識です。railsコンソールで確認した際は実行結果の書籍情報がコンソール上で返ってきました。
winterboum

2021/05/02 10:23

それはsearchアクションであって、newアクションではないです
kaji120

2021/05/04 06:15

勘違いしておりました。ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問