2015-10-24 6 views
10

Sto cercando di capire un modo per verificare se l'hash dei parametri in un'app Phoenix (usando Elixir) ha una chiave particolare o no.Elixir map controlla se non è vuoto e la chiave esiste

Nella funzione di changeset sottostante in un modello, i parametri sono predefiniti su: vuoto.

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

Ho bisogno di capire se una chiave di nome: nome utente esiste nell'hash.

risposta

12

Solo una piccola terminologia, param è una mappa e non un hash. Questo è rilevante quando si sa dove cercare nella documentazione.

Per una mappa è has_key?/2 che restituisce true o false.

Map.has_key?(params, :name) 

Dal momento che si sta utilizzando un insieme di modifiche Ecto allora si può anche utilizzare Ecto.Changeset.get_change/3.

get_change(changeset, key, default \\ nil) 

Questo restituisce default se key non è impostato. Si noti che se key è impostato su nil, verrà restituito lo nil. Se nil è un valore consentito per la modifica, è possibile che si desideri impostare un diverso parametro predefinito.

9

La risposta di Gazeler è ovviamente molto buona. Aggiungerei il pattern matching al mix, come mi sembra, è la soluzione più chiara, che funziona non solo con phoenix, ma con qualsiasi mappa ovunque in 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 
Problemi correlati