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

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

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

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

JSON

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

API

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

Q&A

解決済

2回答

797閲覧

[ruby]nilエラーを回避する方法

hiroshimaeasyry

総合スコア15

Ruby

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

JSON

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

API

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

0グッド

0クリップ

投稿2018/12/29 16:52

編集2018/12/29 16:58

やりたいこと

webAPIの基礎を学習したく、郵便番号APIからjsonデータを取得しrubyで住所を表示するプログラムを書く

Qiitaでこちらの非常にわかりやすい記事を参考にさせていただいた

JSONについてRubyを使用しながら簡単に解説してみる

まずはサンプルコード

ruby

1require 'net/http' #標準ライブラリの呼び出し 2require 'uri' 3require "json" #jsonを使うためのライブラリ 4 5#指定のURLにJSONデータをリクエストしている 6res = Net::HTTP.get(URI.parse('http://zipcloud.ibsnet.co.jp/api/search?zipcode=6695221')) 7 8#表示する 9puts res

console

1# 実行結果 2{ 3 "message": null, 4 "results": [ 5 { 6 "address1": "兵庫県", 7 "address2": "朝来市", 8 "address3": "和田山町秋葉台", 9 "kana1": "ヒョウゴケン", 10 "kana2": "アサゴシ", 11 "kana3": "ワダヤマチョウアキバダイ", 12 "prefcode": "28", 13 "zipcode": "6695221" 14 } 15 ], 16 "status": 200 17}

返ってきたjsonデータを確認することが可能。

もう少し実践的なプログラム

ruby

1require 'net/http' 2require "json" 3require 'uri' 4 5#住所を返却する。無効な郵便番号に関してはメッセージを返す 6def search_address(post_code) 7 res = Net::HTTP.get(URI.parse("http://zipcloud.ibsnet.co.jp/api/search?zipcode=#{post_code}")) 8 hash = JSON.parse(res) 9 10#有効な郵便番号の判別 11 if hash["status"] == 200 12 #住所を返す 13 return hash["results"][0].values.take(3).join("") 14 else 15 #エラーメッセージを返す 16 return hash["message"] 17 end 18end 19 20print "検索する郵便番号を入力してください(ハイフン無し):" 21post_code = gets.chomp 22 23#結果を表示する 24puts search_address(post_code)

初心者にも非常にわかりやすい解説で関心したのだけど...

console

1# 実行し、郵便番号1000001を入力してみる 2$ ruby post.rb 3検索する郵便番号を入力してください(ハイフンなし):1000001 4# 実在する住居表示が出ました 5東京都千代田区千代田

console

1# 実行し、実在しない郵便番号0000000を入力してみる 2$ ruby post.rb 3検索する郵便番号を入力してください(ハイフンなし):0000000 4# nilエラーが発生 5Traceback (most recent call last): 6 1: from post.rb:20:in `<main>' 7post.rb:12:in `search_address': undefined method `[]' for nil:NilClass (NoMethodError)

あれ、条件分岐で有効な郵便番号を判別し、無効な郵便番号に対してはメッセージを返すのでは?
サンプルコードで、

json

1{ 2 "message": null, 3(省略)

となっていたことを思い出しましたが、

  1. json形式で返ってきた"message"がnullなことによってnil:NilClassエラーが起こっている
  2. 条件分岐が良くなくて、elsif でnilエラーを回避できていない
  3. 写経のどこかでスペルミスが起こっている
  4. それ以外

のどれかが考えられます(「それ以外」を選択肢に含めた時点で必ずどれかなのですが)。

実装したいもの

本当は、実在しない郵便番号を入力したらerrorではなくて"do not exist"とか"入力された値は無効です"などdのメッセージを表示してtrueにしたいです。

解決策は何かありますでしょうか?

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

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

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

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

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

guest

回答2

0

nilなのかどうかをifで判断します。

return hash["results"][0].values.take(3).join("")
のところを、

Ruby

1if hash["results"] 2 return hash["results"][0].values.take(3).join("") 3else 4 return "入力された値は無効です" 5end

に。

投稿2018/12/29 17:16

otn

総合スコア84555

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

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

hiroshimaeasyry

2018/12/30 01:30

今回のような場合は["result"]が空かどうかの条件分岐をしないといけないということでした。 上のコードでちゃんと動きが確認できました、ありがとうございました。
guest

0

ベストアンサー

実際に動かして試せてないですが、
>2. 条件分岐が良くなくて、elsif でnilエラーを回避できていない
に該当していると思います。

下記APIのドキュメントを見ると、「入力パラメータエラー」または「API内部で発生したエラー」の場合に、エラー(statusが200以外)となるようです。
郵便番号検索API - zipcloud

上記APIドキュメントに明記されている箇所は見つけれませんでしたが、一般的に「入力パラメータエラー」とするのは、
・必須項目(今回の場合zipcode)が未指定
・入力値が形式不正(桁数がおかしい等)
の場合が多く、今回のように「0000000」の場合は、形式としては正しく、ただ該当する郵便番号データが存在しない、というだけなので、「入力パラメータエラー」とはしない可能性が高いです。

なので、郵便番号データが取得できたかどうかのチェック方法としては、statusを見るのではなく、resultが空かを見ると良いかと思います。

※明記されていない内容で実装するのが怖い場合は、API提供元に問い合わせすれば確実です。

投稿2018/12/29 17:13

aikon_marimo

総合スコア1083

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

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

hiroshimaeasyry

2018/12/30 01:26

条件分岐の仕方としてはやはり["result"]が空かどうかを見たほうがよかったです。 ・正しい入力に対して正しい住居表示 ・存在しない値の入力に対して無効ですの表示 ・桁不足の入力に対して無効の表示 ・何も入力せず送信した結果無効の表示 とうまく分岐できるようになりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問