とりあえず、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
これ、ちょっと試してみます。。
ええと
期待しているように動いてくれないですね。別途きちんと検証の方向で。