Elixir映射检查是否不为空且键是否存在

问题描述 投票:16回答:2

[我正在尝试找出一种方法来检查Phoenix应用程序中的params哈希(使用Elixir)是否具有特定键。

在模型的以下changeset函数中,参数默认为:empty。

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

我需要弄清楚哈希中是否存在名为:username的键。

elixir phoenix-framework ecto
2个回答
20
投票

只是一个小的术语,params是一个映射,而不是一个哈希。当知道在文档中查找位置时,这是相关的。

对于地图,有has_key?/2返回truefalse

Map.has_key?(params, :name)

因为您正在使用Ecto变更集,所以您也可以使用Ecto.Changeset.get_change/3

get_change(changeset, key, default \\ nil)

如果未设置default,则返回key。请注意,如果key设置为nil,则仍会返回nil。如果nil是您更改的允许值,则您可能需要设置其他默认参数。


9
投票

Gazeler的答案显然非常好。在我看来,我只会在混合中添加模式匹配,这是最清晰的解决方案,不仅适用于凤凰,而且适用于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
© www.soinside.com 2019 - 2024. All rights reserved.