(Elixirを使用した)Phoenixアプリのparamsハッシュに特定のキーがあるかどうかを確認する方法を見つけようとしています。
以下のモデルのチェンジセット関数では、paramsのデフォルトは:emptyです。
def changeset(model, params \\ :empty) do
:usernameという名前のキーがハッシュに存在するかどうかを確認する必要があります。
ちょっとした用語のことですが、paramsはマップであり、ハッシュではありません。これは、ドキュメントのどこを見ればよいかを知っているときに関係します。
マップには has_key?/ 2 があり、true
またはfalse
を返します。
Map.has_key?(params, :name)
Ectoチェンジセットを使用しているため、 Ecto.Changeset.get_change/ も使用できます。
get_change(changeset, key, default \\ nil)
default
が設定されていない場合、これはkey
を返します。 key
がnil
に設定されている場合でも、nil
が返されることに注意してください。 nil
が変更に対して許可されている値である場合は、別のデフォルトパラメータを設定できます。
ガゼラーの答えは明らかに本当に良いです。私には、パターンマッチングのみをミックスに追加します。これは、フェニックスだけでなく、Elixirの任意のマップで機能する、最も明確なソリューションです。
# head-only declaration for default params
def changeset(model, params \\ :empty)
def changeset(model, %{"username" => _} = params) do
# username field is in params
end
def changeset(model, params) do
# username is not in params
end