我试图找出一种方法来检查凤凰应用程序(使用Elixir)中的params散列是否有特定的密钥。
在模型中的以下变更集功能中,参数默认为:空。
def changeset(model, params \\ :empty) do
我需要弄清楚哈希是否存在名为:username的密钥。
答案 0 :(得分:17)
只是一个小术语,params是一个地图而不是哈希。知道在文档中查找的位置时,这是相关的。
对于地图,has_key?/2会返回true
或false
。
Map.has_key?(params, :name)
由于您使用的是Ecto变更集,因此您也可以使用Ecto.Changeset.get_change/3。
get_change(changeset, key, default \\ nil)
如果未设置default
,则返回key
。请注意,如果key
设置为nil
,则仍会返回nil
。如果nil
是您允许的更改值,那么您可能需要设置不同的默认参数。
答案 1 :(得分: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