Dialup.Page が提供するヘルパー関数。
概要
Map.merge/2 のラッパー関数。assignsを第一引数に取ることで、パイプライン操作に最適化されている。
use Dialup.Page # で自動的に import されるoverwrite/2
assignsを上書き。既存のキーは新しい値で上書きされる。
overwrite(assigns, overwrite_map)使用例
パイプラインで連結:
def mount(params, assigns) do
id = params["id"]
user = Users.get!(id)
{:ok, assigns
|> overwrite(%{user_id: id}) # assignsを第一引数に取る
|> overwrite(%{user: user})} # パイプラインで連結可能
end動作
base = %{count: 0, user_id: "old"}
base |> overwrite(%{user_id: "123"})
# => %{count: 0, user_id: "123"}set_default/2
デフォルト値を設定。既存のキーは上書きしない。
set_default(assigns, defaults_map)使用例
def mount(_params, assigns) do
{:ok, assigns
|> set_default(%{count: 0}) # 未設定の場合のみ設定
|> set_default(%{loaded: false})}
end動作
base = %{count: 5}
base |> set_default(%{count: 0, loaded: false})
# => %{count: 5, loaded: false}使い分け
| 関数 | 既存キー | 用途 |
|---|---|---|
overwrite/2 | 上書き | 新しいデータで状態を更新 |
set_default/2 | 保持 | 初期値の設定(初回のみ) |
パイプラインでの併用例
def mount(params, assigns) do
# 1. デフォルト値を設定(初回のみ有効)
# 2. URLパラメータに応じて上書き
{:ok, assigns
|> set_default(%{count: 0, errors: []})
|> overwrite(%{user_id: params["id"], loaded: true})}
enddef handle_event("add_error", %{"msg" => msg}, assigns) do
errors = [msg | assigns.errors]
{:update, assigns |> overwrite(%{errors: errors})}
end
def handle_event("clear", _value, assigns) do
{:update, assigns |> overwrite(%{errors: [], input: ""})}
end標準ライブラリとの比較
同等の書き方
# overwrite
assigns |> Map.merge(%{count: 1})
# set_default
%{count: 0} |> Map.merge(assigns)ヘルパー関数は意図を明確にし、一貫したパイプラインスタイルを保つためのもの。
制限
- ネストしたマップのマージは行わない(浅いマージのみ)
- リストの操作は別途行う必要がある