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

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

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

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

5回答

2649閲覧

ajaxで取得したjsonのnull判定ができない。

yuukihayashi

総合スコア147

Ruby on Rails 5

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2019/02/14 02:23

編集2019/02/14 03:07

前提・実現したいこと

現在、openbdという本の情報を取得できるapiを使用し、本のレビューアプリを作成しています。
実現したいこととしてはif文で取得した値のnullを判定し、「本の情報がありません」旨を表示させたいです。

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

ソースコードのように記述していますが、nullを判定できず、条件分岐してくれません。

https://api.openbd.jp/v1/get?isbn=1241の様に適当な数字を入れ実行したところ、
ブラウザ上には[null]と表示されました。

chromeでの検証結果

[null] 0: null length: 1 __proto__: Array(0) concat: ƒ concat() constructor: ƒ Array() copyWithin: ƒ copyWithin() entries: ƒ entries() every: ƒ every() fill: ƒ fill() filter: ƒ filter() find: ƒ find() findIndex: ƒ findIndex() flat: ƒ flat() flatMap: ƒ flatMap() forEach: ƒ forEach() includes: ƒ includes() indexOf: ƒ indexOf() join: ƒ join() keys: ƒ keys() lastIndexOf: ƒ lastIndexOf() length: 0 map: ƒ map() pop: ƒ pop() push: ƒ push() reduce: ƒ reduce() reduceRight: ƒ reduceRight() arguments: (...) caller: (...) length: 1 name: "reduceRight" __proto__: ƒ () [[Scopes]]: Scopes[0] reverse: ƒ reverse() shift: ƒ shift() slice: ƒ slice() some: ƒ some() sort: ƒ sort() splice: ƒ splice() toLocaleString: ƒ toLocaleString() toString: ƒ toString() unshift: ƒ unshift() values: ƒ values() Symbol(Symbol.iterator): ƒ values() Symbol(Symbol.unscopables): {copyWithin: true, entries: true, fill: true, find: true, findIndex: true, …} __proto__: Object

存在しない数字を入れた場合のchrome developer tools上のエラー

Uncaught TypeError: Cannot read property 'summary' of null at buildHtml (books.self-cf274625d10f3ce57f6688d7617e8fe8605e8ef10ac2ff3e48f64e8444310545.js?body=1:3) at Object.<anonymous> (books.self-cf274625d10f3ce57f6688d7617e8fe8605e8ef10ac2ff3e48f64e8444310545.js?body=1:19) at fire (jquery3.self-5af507e253c37e9c9dcf65064fc3f93795e6e28012780579975a4d709f4074ad.js?body=1:3269) at Object.fireWith [as resolveWith] (jquery3.self-5af507e253c37e9c9dcf65064fc3f93795e6e28012780579975a4d709f4074ad.js?body=1:3399) at done (jquery3.self-5af507e253c37e9c9dcf65064fc3f93795e6e28012780579975a4d709f4074ad.js?body=1:9306) at XMLHttpRequest.<anonymous> (jquery3.self-5af507e253c37e9c9dcf65064fc3f93795e6e28012780579975a4d709f4074ad.js?body=1:9549) buildHtml @ books.self-cf274625d10f3ce57f6688d7617e8fe8605e8ef10ac2ff3e48f64e8444310545.js?body=1:3 (anonymous) @ books.self-cf274625d10f3ce57f6688d7617e8fe8605e8ef10ac2ff3e48f64e8444310545.js?body=1:19 fire @ jquery3.self-5af507e253c37e9c9dcf65064fc3f93795e6e28012780579975a4d709f4074ad.js?body=1:3269 fireWith @ jquery3.self-5af507e253c37e9c9dcf65064fc3f93795e6e28012780579975a4d709f4074ad.js?body=1:3399 done @ jquery3.self-5af507e253c37e9c9dcf65064fc3f93795e6e28012780579975a4d709f4074ad.js?body=1:9306 (anonymous) @ jquery3.self-5af507e253c37e9c9dcf65064fc3f93795e6e28012780579975a4d709f4074ad.js?body=1:9549 load (async) send @ jquery3.self-5af507e253c37e9c9dcf65064fc3f93795e6e28012780579975a4d709f4074ad.js?body=1:9568 ajax @ jquery3.self-5af507e253c37e9c9dcf65064fc3f93795e6e28012780579975a4d709f4074ad.js?body=1:9207 (anonymous) @ books.self-cf274625d10f3ce57f6688d7617e8fe8605e8ef10ac2ff3e48f64e8444310545.js?body=1:12 dispatch @ jquery3.self-5af507e253c37e9c9dcf65064fc3f93795e6e28012780579975a4d709f4074ad.js?body=1:5184 elemData.handle @ jquery3.self-5af507e253c37e9c9dcf65064fc3f93795e6e28012780579975a4d709f4074ad.js?body=1:4992

該当のソースコード

book

1$(document).on('turbolinks:load', function() { 2 function buildHtml(book) { 3 var image = '<img "width="150" height="150" + src="' + book[0].summary.cover + '">'; 4 return image; 5 } 6 var formResult = $('#new_review'); 7 $('#submit').on("click",function(e) { 8 e.preventDefault(); 9 var bookName = $('#get-book').find('#isbn').prop('value'); 10 var requestUrl = 'https://api.openbd.jp/v1/get?isbn='; 11 requestUrl += bookName + '&pretty'; 12 $.ajax({ 13 type:"GET", 14 url:requestUrl, 15 dataType:"json" 16 }) 17 .done(function(data) { 18 console.log(data) 19 var image = buildHtml(data); 20 if (data[0] != null){ 21 $('#book-name').val(data[0].summary.title); 22 $('#author-name').val(data[0].summary.author); 23 $('#image_url').val(data[0].summary.cover); 24 $('.book_image').append(image); 25 formResult.css('display', 'block'); 26 } 27 else{ 28 $('.result').append("<p>can't get information</p>") 29 } 30 }) 31 .fail(function() { 32 alert('情報の取得に失敗しました'); 33 }); 34 }); 35}); 36

試したこと

elseif文を追加し「data[0].summary.title == null」などにしても条件分岐してくれませんでした。

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

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

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

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

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

guest

回答5

0

ベストアンサー

条件文の前に参照しているのが原因だと思います。

js

1$(document).on('turbolinks:load', function() { 2 function buildHtml(book) { 3 var image = '<img "width="150" height="150" + src="' + book[0].summary.cover + '">'; // ← ここ 4 return image; 5 } 6//... 7 var image = buildHtml(data); // ← ここで呼び出してる。 8 if (data[0] != null){ 9//... 10});

投稿2019/02/14 03:53

Lhankor_Mhy

総合スコア36074

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

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

yuukihayashi

2019/02/14 04:10

ご回答ありがとうございます。 頂きました回答をもとにvar image = buildHtml(data);をif文の中に含んだところ正常に処理が行われるようになりました。
guest

0

https://api.openbd.jp/v1/get?isbn=1241 を Chrome のアドレスバーに貼り付けて要求を出してみましたが、確かに [null] が返ってきますね。

クロスドメインの問題かとも思いましたが、要求・応答を Fiddler でキャプチャしてみると Access-Control-Allow-Origin: * と CORS 対応になっているようで ajax でも応答は返ってくるはず。

イメージ説明

ということは、質問者さんの書かれた処理(JavaScript のコード)に問題がありそうな気がしますが、Chrome のディベロッパーツールなどを使ってデバッグ・確認できないですか?

【追記】

Visual Studio 2015 で IE11 を使ってデバッグしてみましたが、data[0] が null か否かで判定して良さそうです。質問者さんのコードは if (data[0] != null) ですよね? 何が違うんだろう・・・

イメージ説明

投稿2019/02/14 03:02

編集2019/02/14 03:27
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

yuukihayashi

2019/02/14 04:12

ご回答ありがとうございます。 私もデバック方法があまりわからず、ご回答できておりませんでした。 結果的には、Lhankor_Mhy様にご回答頂いた if文の中に以下を含めることで正常に動作するようになりました。 var image = buildHtml(data);
退会済みユーザー

退会済みユーザー

2019/02/14 04:40

デバッグ出来るようになりましょう。Fiddler などのキャプチャツールを使えるようになりましょう。それなしでは闇夜に鉄砲という感じで開発はおぼつかないと思います。
yuukihayashi

2019/02/14 04:46

ご回答ありがとうございます。 Fiddlerを調べてみます。デバッグの勉強も進めていこうと思います。
退会済みユーザー

退会済みユーザー

2019/02/14 05:21

是非そうされることをお勧めします。デバッガが使えていれば、ステップ実行して、即、問題が表題の「null判定」ではないということが分かって、ここで聞かなくても、5 分ぐらいで自己解決できたと思います。
guest

0

ほんとにnullを返してくれているのでしょうか?
たんにundefinedでは?

投稿2019/02/14 02:40

yambejp

総合スコア114767

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

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

yuukihayashi

2019/02/14 04:05

回答ありがとうございます。一見すると質問内容にも追加しました通り、nullのようでした。
guest

0

requestUrl に入っているURLをブラウザで直に実行してみると分かることもあるのでは。
console.log(data)されたのでしたらその結果も開示可能な限りされたほうが具体的なアドバイスを得られると思います(たぶん後ろに;入れないとエラーになりそうですけど。)

投稿2019/02/14 02:32

m.ts10806

総合スコア80850

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

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

yuukihayashi

2019/02/14 02:37

ありがとうございます。 https://api.openbd.jp/v1/get?isbn=1241の様に適当な数字を入れ実行したところ、 ブラウザ上には[null]と表示されました。 また、chromeでの検証での結果も記載します。 [null] 0: null length: 1 __proto__: Array(0) concat: ƒ concat() constructor: ƒ Array() copyWithin: ƒ copyWithin() entries: ƒ entries() every: ƒ every() fill: ƒ fill() filter: ƒ filter() find: ƒ find() findIndex: ƒ findIndex() flat: ƒ flat() flatMap: ƒ flatMap() forEach: ƒ forEach() includes: ƒ includes() indexOf: ƒ indexOf() join: ƒ join() keys: ƒ keys() lastIndexOf: ƒ lastIndexOf() length: 0 map: ƒ map() pop: ƒ pop() push: ƒ push() reduce: ƒ reduce() reduceRight: ƒ reduceRight() arguments: (...) caller: (...) length: 1 name: "reduceRight" __proto__: ƒ () [[Scopes]]: Scopes[0] reverse: ƒ reverse() shift: ƒ shift() slice: ƒ slice() some: ƒ some() sort: ƒ sort() splice: ƒ splice() toLocaleString: ƒ toLocaleString() toString: ƒ toString() unshift: ƒ unshift() values: ƒ values() Symbol(Symbol.iterator): ƒ values() Symbol(Symbol.unscopables): {copyWithin: true, entries: true, fill: true, find: true, findIndex: true, …} __proto__: Object
m.ts10806

2019/02/14 02:41

質問に追記していただければと。こちらに書かれても他の回答者の目にはつきにくいですし、関連性も見えづらくなります。
m.ts10806

2019/02/14 02:43

data自体nullなのではないでしょうか。 URLを直でブラウザに入れて実行されたほうがconsole.log()で見るよりもデータ実態が分かると思います。
yuukihayashi

2019/02/14 02:48

ご回答ありがとうございます。 質問に追加致しました。 URLで直に実行致しました所、[null]とだけブラウザ上に表示されている状態です。
m.ts10806

2019/02/14 02:50

であれば[0]自体存在しないのでdata == nullですね。 dataがnullでなく、且つ、lengthが0より大きい という条件で試しては?
yuukihayashi

2019/02/14 03:10

ご回答ありがとうございます。 以下のようにif文を変更し、試してみましたがやはり表示されませんでした。 「data != null || data.length > 0」 また、気になるエラーを発見したため、質問の「発生している問題・エラーメッセージ」に 追加致しました。
m.ts10806

2019/02/14 03:11

まあnull返ってきてるなら表示されないのは当然と言えば当然ですが…
m.ts10806

2019/02/14 03:14

「且つ」なので||じゃなくて&&にしないとですね
yuukihayashi

2019/02/14 04:09

ご回答ありがとうございます。 正常にデータが取得できている場合もlength: 1と表示されておりましたため、 data != null && data.length > 0 とすると正常に取得できている場合でもelseが実行されてしまいました。 結果的には、Lhankor_Mhy様のご回答で解決することができました。
m.ts10806

2019/02/14 04:39

解決されたようで何よりです。
yuukihayashi

2019/02/14 05:07

ご回答していただき、本当にありがとうございました。さらに勉強に励みます。
guest

0

if文の中の前で「var image = buildHtml(data);」と変数を定義し、dataを参照していたため、正しく条件分岐できておりませんでした。if文に変数を定義することで解決することができました。

修正後jsファイル

$(document).on('turbolinks:load', function() { function buildHtml(book) { var image = '<img "width="150" height="150" + src="' + book[0].summary.cover + '">'; return image; } var formResult = $('#new_review'); $('#submit').on("click",function(e) { e.preventDefault(); var bookName = $('#get-book').find('#isbn').prop('value'); var requestUrl = 'https://api.openbd.jp/v1/get?isbn='; requestUrl += bookName + '&pretty'; $.ajax({ type:"GET", url:requestUrl, dataType:"json" }) .done(function(data) { console.log(data); if (data[0] != null ){ var image = buildHtml(data); $('#book-name').val(data[0].summary.title); $('#author-name').val(data[0].summary.author); $('#image_url').val(data[0].summary.cover); $('.book_image').append(image); formResult.css('display', 'block'); } else { $('.result').append("<p>can't get information</p>") } }) .fail(function() { alert('情報の取得に失敗しました'); }); }); });

投稿2019/02/14 04:14

編集2019/02/14 04:25
yuukihayashi

総合スコア147

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問