こんにちは、やぎにいです。
やぎすけ Advent Calendar 2016の22日目です。
今日が終わればもう25日まで祝休日ですね。頑張っていきましょう。
昨日は僕がRuby on RailsでつくるAPI(導入編)を書きました。
今日は無事jsonデータを返すところまで作れたものに機能を追加します。
昨日はデータベースに流したアイマスのキャラ情報をすべて返すAPIを作ることが出来ました。
正直言えば、あとは使う側が要らないキャラ情報を使わなくすればいいのでこれで完成!と言っても良いのですが、データ通信量等々を考えると現実的ではありません。アイマスのキャラは300人位いますし、楽曲に至っては600曲くらいありますし今も増えてます(昨日も増えましたね)。
それに対して要素があるとしたらすべてを返すAPIを使おうとすると膨大なデータ量のやりとりになります。
使う側が欲しい分だけをリクエストして、それを返す形が理想です。
というわけで、今回は昨日作ったAPIに「絞り込む」機能を追加したいと思います。
完成形としては
これを目指していきます。
今回は「絞り込み」の機能を実装するわけですが、同時に全件返す昨日作った部分も残しておく形になります。
同時に2つの機能を両立させるためにURIを考えましょう。
僕がGitHubに立てたIssueはこれです。
いや、これは良くない設計だろうと思われるかもしれませんが、ペーペーなので許してください。
僕は以下のように作ろう!と決意しました。
characters/characters/から始まるAPIの使い方、リクエストとレスポンスの仕様などがHTMLで表示されるページを出すcharacters/searchcharacters/search?name="なまえ"とかcharacters/allこのような形にしたいと思います。
ではルーティングを設定してあげましょう。
それぞれGETで叩き、それらはすべてcharacters_controllerに飛ばします。
config/routes.rbがルーティングの設定を記述する場所です。
1 2 3 4 5 | Rails.application.routes.draw do get '/characters', to: 'characters#index' get '/characters/search', to: 'characters#search' get '/characters/all', to: 'characters#all' end |
/charactersにGETリクエストが来たらcharacters_controllerのindexに飛ばす/characters/searchにGETリクエストが来たらcharacters_controllerのsearchに飛ばす/characters/allにGETリクエストが来たらcharacters_controllerのallに飛ばすそんな感じです。
これでルーティングは完成です。
先ほどルーティングでcharacters_controllerに飛ばす部分は作りました。では次はそのコントローラーで受け取り、処理して返却する機能部分を作りましょう。
まずは/charactersにアクセスが来た時。
これはAPIの仕様を記述したHTMLを出力するようにする予定ですが、HTMLファイルを用意していないので、現時点では404エラーを返すようにしましょう
1 2 3 | def index head 404 end |
このdef indexのindexが先ほどルーティングの設定で記述したto: characters#indexの部分になります。
これで/charactersにGETが来たら404が返ってくるようになりました。確認しましょう。

chromeで確認してみるとちゃんと404が返ってきていますね。
head 404はヘッダーで404コードを返しておいてという記述です。
では次に先に全件返す/characters/allを書きましょう。これはコントローラーのallに飛ばされてきます。
1 2 3 4 | def all @characters = Character.all render json: @characters end |
Character.allでデータを全部取得し、それをjsonとして返却する。
そんな感じの記述です(おそらく@はつけないほうが良い気がしている)
これも確認してみましょう。

どうやらちゃんと昨日追加した765プロのアイドルが全部返ってきていますね。大丈夫です。
それでは最後に絞り込む/characters/searchを作ってみましょう。
現在の仕様としてはnameというパラメータ(必須)で名前(一部でもOKだし漢字でもふりがなでもOK)を与えるとそれに合致した物を返す。という仕様で行きましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 | def search if params[:name].blank? render json: [{"error": "100", "msg": "必須パラメーターがありません", "required": {"key": "name"}}] else @result = Character.where("name like ?", "%" + params[:name] + "%") if @result.empty? @result = Character.where("phonetic like ?", "%" + params[:name] + "%") end render json: @result end end |
こんな感じにとりあえず作ってみました。
まず最初に必須パラメータのnameがあるかチェック、ない場合はエラーなjsonを返却。
次にデータベースのnameにパラメータのnameで検索し、当てはまったものを@resultに持っておく。
もしそれが空なら、ふりがなでも検索してみる。という形を取っています。
正しく動いているか確認してみましょう。
パラメータを渡さないときにエラーなjsonが返ってきているか

大丈夫ですね、ベタ書きしたjsonが返ってきています。
名前で検索できているか


試しに天海と海で検索してみました。
天海では天海春香さんしか居ないわけですので、1件返ってきています。
海では天海春香さんと、名前に海が入っている双海亜美双海真美姉妹もいるので、合計3件返ってきています。
ふりがなで検索できているか


試しにあまみとまみで検索してみました。天海さん大人気ですね。
あまみでは合致するのがあまみはるかさんのみなので1件返ってきています。
まみではあまみはるかのまみとふたみまみのまみで2件返ってきています。
どれにも当てはまらないときは空で返ってきているか

試しに事務員である音無小鳥で検索してみますと、ちゃんと空が返ってきていますね。
これで確認が完了しました。
絞り込むことに成功です、これで任意のアイドルの件数分だけ使う側は引っ張ってくることが出来ます。
ある程度APIの形が出来てきたので、次はテストなり、Railsについてなりここまでの悪い点の修正なりを明日やりたいと思います。
個人で使うレベルにはさくっとAPIを作れるので大変ステキなフレームワークですね。Railsを普通に触るのは初めてですが、とても楽しいです。
ちゃんとレスポンスが返ってくるのを自分で作って見れるのは成果がわかってモチベーションの向上にもつながりますね。
以上、やぎにいでした!
<< Ruby on RailsでつくってみるAPI(まとめと考察) Ruby on RailsでつくるAPI(導入編) >>
2018やぎ小屋