2016-01-03 5 views
1

У меня возникла проблема с обновлением модели из ответа JSON через одно из моих действий. Вот установка:Elm update model from json response

У меня есть модели, выглядит следующим образом:

type alias Model = 
    { totals: Totals.Total // all values are initialized as 0 or 0.0 
    } 

-- In other module 

type alias Total = 
    { days : Int 
    , avgPerDay: Float 
    , reports : Int 
    , people : Int 
    , locations : Int 
    , totalCoffees : Int 
    , coffeesPerDay: Float 
    } 

Декодер для указанной модели:

decodeTotal : Json.Decoder Total 
decodeTotal = 
    object7 Total 
     ("days" := Json.int) 
     ("avgPerDay" := Json.float) 
     ("reports" := Json.int) 
     ("people" := Json.int) 
     ("locations" := Json.int) 
     ("totalCoffees" := Json.int) 
     ("coffeesPerDay" := Json.float) 

Чтобы обновить модель, следующий запрос Http называется:

getTotals : Effects Action 
getTotals = 
    Http.get Totals.decodeTotal ("/reports/totals") 
    |> Task.toMaybe 
    |> Task.map TotalsFetched 
    |> Effects.task 

Отклик сервера 200 OK с этим телом: {"days":347,"reports":1793,"avgPerDay":5.167147,"people":205,"locations":332,"coffees":146,"coffeesPerDay":0.42074928}

Однако в TotalsFetched действий:

update : Action -> Model -> (Model, Effects Action) 
update action model = 
    case action of 
    TotalsFetched totals -> 
     log (toString totals) -- logs Nothing 
     ({ model | totals = Maybe.withDefault model.totals totals } 
     , Effects.none 
    ) 

Я предполагаю, что, поскольку totals является Nothing моя модель просто остается, как описано в Maybe.withDefault

Я не понимаю, почему totals не ничего вместо декодированного ответа с сервера. Это мой первый проект вяза, поэтому я не удивлюсь, если я убью что-то действительно очевидное для обученного глаза.

ответ

1

Ваш json возвращает поле под названием coffees, пока ваш декодер ищет totalCoffees.

Возможно, вы захотите использовать Task.toResult вместо Task.toMaybe, потому что таким образом вы получите сообщение об ошибке, когда что-то пойдет не так.

+0

Это было. Спасибо, что заметили крошечную ошибку и предложение использовать 'Task.toResult'. Безмолвная неудача затруднила это. – sambev