2015-10-24 8 views
10

Ich versuche, einen Weg zu finden, um zu überprüfen, ob die Params-Hash in einer Phoenix App (mit Elixir) einen bestimmten Schlüssel hat oder nicht.Elixir Karte überprüfen, wenn nicht leer und Schlüssel existiert

In der folgenden Changeset-Funktion in einem Modell ist der Parameter standardmäßig auf: leer gesetzt.

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

Ich muss herausfinden, ob ein Schlüssel namens: Benutzername im Hash vorhanden ist.

Antwort

12

Nur eine kleine Terminologie Sache, Params ist eine Karte und kein Hash. Dies ist relevant, wenn Sie wissen, wo Sie in der Dokumentation nachsehen können. Für eine Karte gibt es has_key?/2, die true oder false zurückgibt.

Map.has_key?(params, :name) 

Da Sie eine Ecto changeset verwenden, dann können Sie auch Ecto.Changeset.get_change/3 verwenden.

get_change(changeset, key, default \\ nil) 

Das gibt default wenn key nicht gesetzt ist. Bitte beachten Sie, dass, wenn key auf nil eingestellt ist, nil immer noch zurückgegeben wird. Wenn nil ein zulässiger Wert für Ihre Änderung ist, möchten Sie möglicherweise einen anderen Standardparameter festlegen.

9

Gazelers Antwort ist offensichtlich sehr gut. Ich würde dem Mix nur Pattern Matching hinzufügen, da es scheint, dass das die klarste Lösung ist, die nicht nur mit Phoenix, sondern mit irgendeiner Karte in Elixir funktioniert.

# 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 
Verwandte Themen