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})}
end
def 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)

ヘルパー関数は意図を明確にし、一貫したパイプラインスタイルを保つためのもの。

制限

  • ネストしたマップのマージは行わない(浅いマージのみ)
  • リストの操作は別途行う必要がある