2016-02-03 8 views
5

In un modulo Phoenix Framework, ho una casella di selezione sulla mia pagina che ha un'opzione per impostare un valore appartiene_to a zero.In un modulo Phoenix Framework, come posso impostare di nuovo una relazione di proprietà a null usando un changeset?

<%= select f, :relation_id, 
    Enum.into(Enum.map(@relations, fn p -> {p.name, p.id} end), 
    [{"None", nil}]) %> 

La forma di solito inviare l'ID, ma quando viene selezionato il valore nullo, esso passa il valore come una stringa vuota:

"relation_id" => "" 

io ricevere un errore dal Ecto che il cambiamento non è valido , in quanto si aspetta un intero. Potrei probabilmente intercettare la mappa, impostare il valore su null e passare la mappa aggiornata nel changeset. Ma c'è un modo più semplice per farlo?

+0

Come si precarica il campo 'relations' nel controller? Non riesci a trovare un esempio su come farlo con un changeset. Grazie – Paco

+0

Ahh: la selezione si aspetta solo una lista base di tuple e può essere generata come preferisci. In questo caso, @relations era semplicemente un tiro diretto usando Repo.all: relations = Repo.all (relation_query), e poi passato nella visualizzazione nel comando render. –

risposta

5

Penso che dovresti usare la spina scrub params.

provare ad aggiungere al controller:

defmodule MyApp.SomeThingController do 
    use MyApp.Web, :controller 

    plug :scrub_params, "some_thing" when action in [:create, :update] 

    # def .... 
end 

Sarà convertire "" valori (vuoto) a nil valori.

Spero che aiuti.