/var/log/messages

Apr 7, 2019 - 2 minute read - Comments - programming

phoenix excersize (7)

とりあえず、Flash Messages の節から続きを。

Flash Messages

  • put_flash/3 と get_flash/2` が Phoenix.Controller から提供されている
  • 以下なナニ、確認してみます。
  def index(conn, _params) do
    conn
    |> put_flash(:info, "Welcome to Phoenix, from flash info!")
    |> put_flash(:error, "Let's pretend we have an error.")
    |> render("index.html")
#    render conn, "index.html"
  end

info と error で背景色が違うんですね。成程。つうか cloud9 で

  • sudo service postgresql start しないと、というのを忘れていたのと
  • コマンドラインで mix phoenix.server しないと、なのが忘却の彼方でorz

ちなみに web/templates/layout/app.html.eex にて

      <p class="alert alert-info" role="alert"><%= get_flash(@conn, :info) %></p>
      <p class="alert alert-danger" role="alert"><%= get_flash(@conn, :error) %></p>

な記述があるので、とのことでした。成程。ちなみに

  • clear_flash/1 はセッションに保存されている flash message を削除、とのことでした

Rendering

  • controller にはコンテンツを rendering する方法がいくつかある
    • 最も簡単なのは text/2 で plane text を、という方法
def show(conn, %{"id" => id}) do
  text(conn, "showing id #{id}")
end

このアクションに get "out_path/:id" への route が mapping されているのであればブラウザから /out_path/15 にアクセスすると plain text としてshows id 15` が表示されるはず、とのこと。text の次は json な模様で以下。

def show(conn, %("id" => id)) do
  json(conn, %{id: id})
end

あるいはテンプレなしで html を render する例も出ています。詳細略。

  • json/2 は API 記述に役立つ
  • 基本的には Phoenix が提供する render/3 を使う
def show(conn, %{"messenger" => messenger}) do
  render(conn, "show.html", messenger: messenger)
end
  • render/3 が正しく機能するためには
    • controller は個々の view と同じ route 名を持つ必要がある
    • 個々の view も show.html.eex が存在するテンプレートディレクトリと同じ route 名を持つ必要がある
    • HelloController には HelloView が必要で、HellowView には lib/hello_web/templates/hello ディレクトリが必要
    • 現状だと web/templates/hello ですね

以下な例が面白いですね。conn を戻す Plug.Conn.assign/3 というのがアレ。

def index(conn, _params) do
  conn
  |> assign(:message, "Welcomd Back!")
  |> render("index.html")
end

複数だったらこんなのとか

def index(conn, _params) do
  conn
  |> assign(:message, "Welcomd Back!")
  |> assign(:name, "Dweezil")
  |> render("index.html")
end

あるいは default 値が云々であれば以下とか

plug :assign_welcome_message, "Welome Back"

def index(conn, _params) do
  conn
  |> assign(:message, "Welcome Forward")
  ~> render("index.html")
end

defp assign_welcome_message(conn, msg) do
  assign(conn, :message, msg)
end

これ、ちょっと試してみます。。

ええと

期待しているように動いてくれないですね。別途きちんと検証の方向で。