Elixir map check如果不为空且密钥存在

Pra*_*oya 15 elixir ecto phoenix-framework

我试图找出一种方法来检查凤凰应用程序(使用Elixir)中的params散列是否具有特定的密钥.

在模型中的以下变更集功能中,参数默认为:空.

def changeset(model, params \\ :empty) do
Run Code Online (Sandbox Code Playgroud)

我需要弄清楚哈希中是否存在名为:username的密钥.

Gaz*_*ler 19

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

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

Map.has_key?(params, :name)
Run Code Online (Sandbox Code Playgroud)

由于您使用的是Ecto变更集,因此您也可以使用Ecto.Changeset.get_change/3.

get_change(changeset, key, default \\ nil)
Run Code Online (Sandbox Code Playgroud)

default如果key未设置,则返回.请注意,如果key设置为,nilnil仍将返回.如果nil您的更改是允许值,那么您可能需要设置不同的默认参数.


mic*_*ala 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
Run Code Online (Sandbox Code Playgroud)