Excelから関数型言語マスター4回目:Webに外部APIデータ表示...をやってみた

元記事様: https://qiita.com/piacerex/items/4c212615a4eb699dd109

実行環境

・Mac OS v10.15.7(スペックがゴミすぎてOSのアップデートが不能💦)

・Elixir v1.13.2 ( Erlang/OTP 24)

・Phoenix  v1.6.6

データ内にある「列名」で列表示

見出し行を追加↓

<%
result = Db.query( "select * from members" )
data = result |> Db.columns_rows
columns = result |> Db.columns
%>
<table border="1">
<%= for record <- data do %>
<tr>
 <%= for column <- columns do %>
 <td><%= record[ column ] %></td>
 <% end %>
</tr>
<% end %>
</table>

前回のがこちら↓ 間違い探し...

<%
result = Db.query( "select * from members" )
data = result |> Db.columns_rows
%>
<table border="1">
<%= for record <- data do %>
<tr>
   <td><%= record[ "name" ] %></td>
   <td><%= record[ "age" ] %></td>
   <td><%= record[ "team" ] %></td>
   <td><%= record[ "position" ] %></td>
</tr>
<% end %>
</table>

何が前回と違うか見比べてみる。

columns = result |> Db.columns

columns は、 resultの結果をDb.columnsに代入したもの?という認識であっているのかな?

※ 間違えてたらすみません。分かり次第修正します。


複数列データの「列の抽出」

 |> Enum.map( fn( record ) -> %{ "name" => record[ "name" ], "age" => record[ "age" ] } end )

record全体の中から、"name" と "age"  の要素だけ指定して表示に絞り込み


スクリーンショット 2022-01-30 8.59.55

...あれ?要素の表示順がお手本と違う...どこかに変なソートでもかけたかな?とりあえずそのまま進みます。


|> Enum.filter( fn( column ) -> column == "name" || column == "age" end )

Enum.filterはExcelでいうところの「非表示」だったね。より短い書き方だとこうなる。

columns = [ "name", "age" ]


外部API呼出のためのライブラリをインストール

#mix.exsを開いて...

defmodule SampleDb.Mixfile do
 use Mix.Project
…
 defp deps do
   [
#以下の1行を書き加える
     { :smallex, "~> 0.1" }, 
     …
   ]
 end


第3回目で「qキーで抜け」と言われていたのでここでもqキーで抜けて、それからSmallexおよび関連ライブラリ一通りを取得

(最初、立ち上げたPhoenix PJ からの抜け忘れでmix deps.get を叩いてもエラーが返ってきて焦った😅)

mix deps.get
SmallexのJsonモジュールを使うと、外部API呼出は、URLのドメインとパスを指定するだけで実行でき、呼出結果もマップリスト化してくれます

すごい、簡単に呼び出しができる上、マップリスト化までしてくれる。これは手数が省ける〜!

Qiita APIを呼んでQiitaコラム情報をWeb表示する

んで、QuitaのURLのドメインとパスを指定して

#lib/sample_db_web/templates/page/index.html.heex を編集

<%
result = Json.get( "https://qiita.com", "/api/v2/items?query=elixir" )
data = result
columns = [ "id", "title", "created_at" ]
%>
<table border="1">
<tr>
 <%= for column <- columns do %>
 <th><%= column %></th>
 <% end %>
</tr>
<%= for record <- data do %>
<tr>
 <%= for column <- columns do %>
 <td><%= record[ column ] %></td>
 <% end %>
</tr>
<% end %>
</table>

出てくるのがこちら。

スクリーンショット 2022-01-30 10.34.34

ちゃんと、新しい記事が投稿されたら表も更新されています。


ちなみに

"https://qiita.com", "/api/v2/items?query=elixir" 

の中身を覗きに行ったらどなたが書いたかわかる文字がちらほら...😁(脱線したので戻ります)

スクリーンショット 2022-01-30 10.27.41


書き換えたHTML部分はここだけ

#lib/sample_db_web/templates/page/index.html.heex の一部


<%
result = Json.get( "https://qiita.com", "/api/v2/items?query=elixir" )
data = result
columns = [ "id", "title", "created_at" ]
%>
更に、「<table~」で始まるHTML部分は、DB表示のものと全く変えていません
つまり、外部APIで取得したデータも、DBと全く同じように扱える点に注目してください

また汎用性の高さを見せつけてくれる!


さあ、次回は何ができるだろう?

参考: https://academy.gmocloud.com/know/20160425/2259


この記事が気に入ったらサポートをしてみませんか?