web-dev-qa-db-ja.com

エリクサーマップは空ではなく、キーが存在するかどうかをチェックします

(Elixirを使用した)Phoenixアプリのparamsハッシュに特定のキーがあるかどうかを確認する方法を見つけようとしています。

以下のモデルのチェンジセット関数では、paramsのデフォルトは:emptyです。

def changeset(model, params \\ :empty) do

:usernameという名前のキーがハッシュに存在するかどうかを確認する必要があります。

16
Pratik Khadloya

ちょっとした用語のことですが、paramsはマップであり、ハッシュではありません。これは、ドキュメントのどこを見ればよいかを知っているときに関係します。

マップには has_key?/ 2 があり、trueまたはfalseを返します。

Map.has_key?(params, :name)

Ectoチェンジセットを使用しているため、 Ecto.Changeset.get_change/ も使用できます。

get_change(changeset, key, default \\ nil)

defaultが設定されていない場合、これはkeyを返します。 keynilに設定されている場合でも、nilが返されることに注意してください。 nilが変更に対して許可されている値である場合は、別のデフォルトパラメータを設定できます。

20
Gazler

ガゼラーの答えは明らかに本当に良いです。私には、パターンマッチングのみをミックスに追加します。これは、フェニックスだけでなく、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
9
michalmuskala