LoginSignup
4
2

More than 3 years have passed since last update.

Phoenixで湯婆婆を実装してみる

Last updated at Posted at 2020-11-08

はじめに

0. 準備

1. プロジェクト作成

$ mix phx.new yubaba --live
$ cd yubaba

2. ソースコードを書く

lib/yubaba/yubaba.ex
defmodule Yubaba.Yubaba do
  def new_name(""), do: "千"

  def new_name(name) do
    if String.contains?(name, "千") do
      "千"
    else
      String.codepoints(name) |> Enum.random()
    end
  end
end
  • 何も入力されていない場合には"千"、入力文字列に"千"が含まれていれば"千"、それ以外はランダムに選ぶということにしました
lib/yubaba_web/live/yubaba_live.ex
defmodule YubabaWeb.YubabaLive do
  use YubabaWeb, :live_view

  def mount(_params, _session, socket) do
    socket = assign(socket, name: "", submitted: false, new_name: "")
    {:ok, socket}
  end

  def render(assigns) do
    ~L"""
    <h1>湯婆婆</h1>
    <%= if @submitted do %>
      <img src="images/chihiro017.jpg">
    <% else %>
      <img src="images/chihiro016.jpg">
    <% end %>
    <form phx-submit="yubaba">
      <input type="text" name="name" value="<%= @name %>"
        placeholder="契約書だよ。そこに名前を書きな。"
        autofocus autocomplete="off" />

      <button type="submit">
        回答
      </button>
      <%= if @submitted do %>
        <a href="/yubaba">もう一度</a>
      <% end %>
    </form>

    <%= if @submitted do %>
    <pre>
    フン。<%= @name %>というのかい。贅沢な名だねぇ。
    今からお前の名前は<%= @new_name %>だ。いいかい、<%= @new_name %>だよ。分かったら返事をするんだ、<%= @new_name %>!!
    </pre>
    <% end %>
    """
  end

  def handle_event("yubaba", %{"name" => name}, socket) do
    new_name = Yubaba.Yubaba.new_name(name)

    socket =
      assign(socket,
        name: name,
        new_name: new_name,
        submitted: true
      )

    {:noreply, socket}
  end
end
lib/yubaba_web/router.ex
@@ -18,6 +18,7 @@ defmodule YubabaWeb.Router do
     pipe_through :browser

     live "/", PageLive, :index
+    live "/yubaba", YubabaLive
   end
  • ↑↑↑ ここまででもOKです

おまけ

  • ここからはおまけです
  • 入力された値と変換後の値をPostgreSQLに保存してみます
$ mix phx.gen.live Accounts User users name new_name
  • どどっとファイルができます
  • まあ気にしないことにしましょう
  • lib/yubaba_web/router.exにパスを追加します
lib/yubaba_web/router.ex
@@ -19,6 +19,13 @@ defmodule YubabaWeb.Router do

     live "/", PageLive, :index
     live "/yubaba", YubabaLive
+
+    live "/users", UserLive.Index, :index
+    live "/users/new", UserLive.Index, :new
+    live "/users/:id/edit", UserLive.Index, :edit
+
+    live "/users/:id", UserLive.Show, :show
+    live "/users/:id/show/edit", UserLive.Show, :edit
   end
  • 入力値と変換後の値を保存するコードを足します
YubabaWeb.YubabaLive
   def handle_event("yubaba", %{"name" => name}, socket) do
     new_name = Yubaba.Yubaba.new_name(name)

+    {:ok, %Yubaba.Accounts.User{}} =
+      Yubaba.Accounts.create_user(%{name: name, new_name: new_name})
+
     socket =
       assign(socket,
         name: name,
  • あとはLiveViewでinfinite scroll (Elixir/Phoenix)なんてのをやるとおもしろいかもしれません
  • 本題とははずれるので紹介のみにしておきます
  • その他、ここで書いていない細かな修正などあるのですが、細かいですし、そろそろ面倒になってきたのでソースコードを公開しておきます
  • TORIFUKUKaiou/yubaba

3. 実行

$ mix phx.server

Visit: http://localhost:4000/yubaba

スクリーンショット 2020-11-09 0.05.40.png

スクリーンショット 2020-11-09 0.06.55.png

Wrapping Up :lgtm: :qiita-fabicon: :lgtm:

  • @momeemtさんの記事にある通り、入力を受け取ってそれを変換して出力するというのは、プログラミングの基本ーー大きく言うと、つまり湯婆婆はこれからの"Hello, World"における例題の一つのような気がしています
    • 将棋の原田泰夫九段が提唱された三手の読み(こうやる、こう来る、そこでこう指す)に通じるものがあるような気がします
    • 令和のHello World!との呼び声も!(@everylittle さん)
  • Enjoy Elixir !!! :rocket::rocket::rocket:

  1. http://www.ghibli.jp/info/013344/?s=03 には、「常識の範囲でご自由にお使いください」と書いてあります 

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2