2015-06-03 4 views
5

Sto facendo la mia prima applicazione Phoenix e sto provando a fare il nuovo controller/2. Il codice che ho scritto èController Phoenix orribilmente ridondante

def new(conn, %{"fbid" => fbid, "latitude" => lat, "longitude" => lng, "content" => content}) do 
    {fbid, _} = Integer.parse(fbid); 
    {lat, _} = Float.parse(lat); 
    {lng, _} = Float.parse(lng); 

    chats = %Chat{:fbid => fbid, :latitude => lat, :longitude => lng, :content => content} 
     |> Repo.insert 
     |> List.wrap 
     |> Poison.encode! 
    render conn, chats: chats 
end 

Ma sembra orribilmente ridondante e non riesco a trovare un modo migliore per fare questo. Ho letto che non c'è modo di convertire Map to Struct, e dal momento che i parametri differiscono nel tipo non funzionerebbe comunque.

Quindi qualcuno può mostrarmi un modo magico per mapparlo?

risposta

5

Si prega di guardare in gruppi di modifiche Ecto come fanno colata in base alle informazioni del modello. Si prenderanno cura di tutte le analisi, la convalida e altro.

Il mio consiglio è quello di utilizzare uno dei mix phoenix.gen.html o mix phoenix.gen.json per generare qualche struttura di esempio in modo da imparare rapidamente come tutti i pezzi si incastrano:

mix phoenix.gen.html Chat chats fbid:integer latitude:float longitude:float content:string 

Nota pensato che il generatore sarà in conflitto con il codice di cui sopra, se si dispone di già definito un modello Chat.

+0

Quindi non esiste una soluzione di puro codice? Non mi piacciono i comandi di generazione del codice. È imbroglio;) –

+3

Il generatore non è lì per generare l'intera applicazione, è lì come uno strumento di apprendimento per mostrarti come strutturare il tuo codice. Non è necessario utilizzarlo alla fine della giornata, ma dai un'occhiata a ciò che viene generato almeno una volta per apprendere i concetti richiesti per costruire CRUD in Phoenix. –

+0

Dopo la generazione, 12 test su 14 falliscono perché Project.ErrorView.render/2 non è definito. Dovrei generarlo anche in qualche modo o scrivere a mano? –

-1

La funzione struct convertirà una mappa ad una struct:

iex(3)> defmodule User do   
...(3)> defstruct name: "john"  
...(3)> end 

iex(4)> struct(User, %{name: "foo"}) 
%User{name: "foo"} 
+0

E le differenze di tipo? Come parsing di Integers and Floats? –

+0

@KrzysztofWende cosa intendi? È scoraggiato inizializzare una struct da una mappa usando struct()? – Papipo