Open23

読者コミュニティ|Phoenix LiveView 入門①: はじめの一歩

宇都木朗宇都木朗

Chapter 07の記述ですが、/root ではなく、/robot ではないでしょうか。

この結果、ブラウザで /root パスにアクセスしたときに RobotLive モジュールが応答し、

宇都木朗宇都木朗

Chapter 06の「要素の形状をボタン化する」のファイルがrobot_live.html.heexになっていますが、おそらくindex.html.heexのことだと思います。

rickyricky

Chapter 05の「hello アクションの改造」の”hello アクションのための HEEx テンプレートを次のように書き換えてください。”についてですがindex.html.heexに<%= @name %>を指定するとlocalhost:4000にアクセスした際にエラーが発生します。
恐らく<%= @name %>の記述が必要なのはhello.html.heexではないかと思います。

kkanakkana

Chapter12のライブナビゲーションについて質問なのですが、
link/1コンポーネントを利用して各ボタンを修正した際に
これを処理するイベントハンドラは必要ないのでしょうか?

自分の環境ではそのままでは動作しなかったため以下のようなハンドラを追加しました

def handle_params(%{"step" => step}, _uri, socket) do
    {step, ""} = Integer.parse(step)
    socket = assign(socket, :wizard_step, step)
    {:noreply, socket}
  end

def handle_params(_params, _uri, socket) do
    socket = assign(socket, :wizard_step, 0)
    {:noreply, socket}
end

これで動作するようにはなったのですが、何か考慮漏れしていますでしょうか?

また、ウィザードの状態を管理するRootLiveモジュールと
記載がありますがRobotLiveのことでしょうか

黒田努黒田努

丁寧に読んでいただき、ありがとうございます。

ご指摘の通り、関数 handle_params/2 を追加する必要があります。私の手元にある JauntyGreeter のソースコードにはこの関数が存在しましたが、本の原稿を書く際に見落としてしまいました。

また、RootLiveRobotLive の間違い(typo)です。

先程、Chapter 12 を更新しました。関数 handle_params/2 の説明が加わっています。

menomotomenomoto

いくつかご質問させてください。

  1. Chapter 05 インデックスページの改造のソースコード
    誤:<a href="/hello" class="underline text-blue-700">Greeting</a>
    正:<a href={~p(/hello)} class="underline text-blue-700">Greeting</a>
    ではないでしょうか。

  2. Chpter 09 LiveViewプロセスの状態を変更する
    以下の文章の2行目(LiveView プロセスからをデータを受け取ることが…)は誤りだと思われます。

  3. Chapter 09 LiveViewプロセスの状態を変更する
    以下の文章の3行目(そてい、このパラメータを受け取るために…)は誤りだと思われます。

黒田努黒田努

誤記を指摘していただきありがとうございます。

修正いたしました。

menomotomenomoto

Chapter14 静的ファイルの提供
音声
Ubuntu シェル B で以下のコマンドを順に実行し、「Audio」タブが選択された時に表示する音声ファイルをダウンロードしてください。

mkdir -p priv/static/audios
wget ${BASE_URL}/kenne.png -O priv/static/audios/kenne.png

上記のコマンドを実行しましたが、音声ファイルが見つかりませんでした。
(画像と動画のファイルは見つかりました。)

黒田努黒田努

ご報告ありがとうございます。下記のように訂正いたします。

誤 wget ${BASE_URL}/kenne.png -O priv/static/audios/kenne.png
正 wget ${BASE_URL}/kenne.png -O priv/static/audios/kenne.mp3
kkanakkana

Chapter12について質問させてください。

ウィザードの状態を変更する関数を用意する
の説明についてですが、handle_eventのコードスニペットでは
以下のように記載されている箇所が

{step, ""} = Integer.parse(step)

さて、追加された関数節の本体 1 行目をご覧ください:

以下の部分では

{step, _} = Integer.parse(step)

と記載されています。

前者のコードではタプルの2つ目の要素が空文字であることを期待している記載になり
後者のコードでは要素が何であってもパターンマッチする処理になると思うのですが、
認識に相違はありますでしょうか?

またここで記載されている処理の場合、後者が適切なコードになるのでしょうか?

黒田努黒田努

関数 Integer.parse/2 は、"30.25" のような文字列を取って {30, ".25"} のようなタプルを返します。タプルの第2要素は、小数点以下の部分です。

該当箇所のソースコードはこうなっています:

   def handle_event("set_wizard_step", %{"step" => step}, socket)
       when step in ~w(0 1 2 3 4) do
     {step, ""} = Integer.parse(step)
     socket = assign(socket, :wizard_step, step)
     {:noreply, socket}
   end

変数 step には "0" のような小数点以下の部分を持たない数字が来ることがわかっているので {step, ""} でパターンマッチングを行っていますが、"" の部分は自明なので _ と書いても意味は変化しません。どちらでもよいです。

Chapter 12の記述については、{step, ""} で統一します。

menomotomenomoto

Chapter14
フィンガープリンティングによるキャッシュ制御

ブラウザで画像、音声、動画が正常に表示されることを確認した後、Chrome DevTools を用いて画像の URL パスを確認してください。今度は /images/letter_a-a144cdbd2afa39fd2cb2cfe92ce43712.png となっているはずです。

上記について、URLパスを確認したところ、 /images/letter_a-a144cdbd2afa39fd2cb2cfe92ce43712.png?vsn=dとなっていました。
(音声、動画のURLパスも同様)

これについて簡単に解説していただけませんでしょうか。

黒田努黒田努

URL パスの ? より後ろは「クエリ文字列」と言います。

通常、画像ファイルのURLパスにはクエリ文字列は付きませんが、付けても構いません。

Issue 1784でのジョゼの説明によれば、?vsn=d というクエリ文字列は、サーバーがそのファイルを長期に渡ってキャッシュするのに必要だそうです。

kkanakkana

Chapter12の関数コンポーネントに関して質問させてください。

冒頭で次に、3つのボタンを作り変えていきます。という記載がありますが。
こちらの項目ではStart、Cancel、Back、Nextの4つのボタンを関数コンポーネントとして切り出しているようです。
また、Finishボタンは関数コンポーネントに変換されていませんが、
関数コンポーネント化したほうが一貫性があるように感じました。
Finishボタンに触れられていないのは意図があるのでしょうか?

黒田努黒田努

「3 つ」を「4 つ」に修正しました。

また、Finishボタンは関数コンポーネントに変換されていませんが、
関数コンポーネント化したほうが一貫性があるように感じました。

ご指摘の通りです。近々、本書全体を書き直すつもりですので、その際に Finish ボタンも関数コンポーネント化します。

menomotomenomoto

Chapter17 表を描く
lib/jaunty_greeter_web/live/cyborg_live.ex (New)
上記のファイルに+で表記されているコードが必要かと思われます。

 defmodule JauntyGreeterWeb.CyborgLive do
   use JauntyGreeterWeb, :live_view
+  alias JauntyGreeterWeb.Shared
 end

menomotomenomoto

Chapter18 グラフを描く
lib/jaunty_greeter_web/live/cyborg_live.ex
(84-87 行)

凡例のタイトルを消すためには以下のように修正する必要があると思われます。

 |> VegaLite.encode_field(:color, "max_or_min",
  type: :nominal,
- title: "Legend"
+ title: ""
 )
黒田努黒田努

筆者より読者の皆様へ

2024年12月4日に Phoenix LiveView の 1.0.0 がリリースされたことを受けて、本書全体を書き直しました。

もっとも目立つ変更点は、これまで HEEx テンプレート内で <%= @value %> のように書いていたところを {@value} と書き直したことです。

次に重要な点は、Chapter 18 で vega_lite ライブラリと同時に vega_lite_convert ライブラリを導入したこと、廃止予定の VegaLite.Export.to_svg/1 の代わりに
VegaLite.Convert.to_svg/1 を使ったことです。

その他、ソースコードの折返し位置などを変更しています。

また、各章末に「コミット履歴」という節を設けました。コミットIDを用いて git checkout すれば本書の途中から学習を再開できます。詳しくは Chapter 01 内の「コミット履歴について」をご覧ください。

なお、これまで Chapter 01 内にあった「Elixir チートシート」は別記事「Elixir チートシート」として独立させました。