【问题标题】:elm post json to rails榆树将json发布到rails
【发布时间】:2018-08-01 19:16:33
【问题描述】:

我探索 Elm 和 Rails Api 作为服务器。 从 Rails 获取数据很容易,但如何 POST。

Rails score.json中有一个表scores:

[
  {
  id: 1,
  name: "Larry",
  score: 100
  }
]

在 Elm 我有解码/编码

scoreDecoder : Decoder Score
scoreDecoder =
Decode.map3 Score
    (field "id" Decode.int)
    (field "name" Decode.string)
    (field "score" Decode.int)


encodeScore : Model -> Encode.Value
encodeScore model =
    Encode.object
    [ ("name", Encode.string model.name)
    , ("score", Encode.int (sumMarkedPoints model.entries))
    ]

还有一个命令:

postScore : Model -> Cmd Msg
postScore model =
let
    url =
        "http://localhost:3000/scores"

    body =
        encodeScore model
            |> Http.jsonBody

    request =
        Http.post url body scoreDecoder
in
    Http.send NewScore request

我有按钮发送消息:ShareScore

update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
ShareScore ->
        ( model, postScore model )

我得到: 发布您的分数时出错:BadStatus { status = { code = 400, message = "Bad Request" }, headers = Dict.fromList [("content-type","application/json; charset=UTF-8")], url = "http://localhost:3000/scores", body = "{\"status\":400,\"error\":\"Bad Request\",\"exception\":\"#\u003cActionController::ParameterMissing: 参数丢失或值为空:

需要一些帮助来“解码”那个..

def score_params
  params.require(:score).permit(:id, :name, :score)
end

【问题讨论】:

    标签: ruby-on-rails json ruby-on-rails-5 elm


    【解决方案1】:

    看来,Rails 期望您的输入类似于:

    {
      score: {  
        name: "Larry",
        score: 100
      }
    }
    

    但您只传递了{ name: "Larry", score: 100 },因此缺少必需的score 键。

    其中一个选项是将您的编码器增强为:

    encodeScore : Model -> Encode.Value
    encodeScore model =
        Encode.object
            [ ( "score"
              , Encode.object
                    [ ( "name", Encode.string model.name )
                    , ( "score", Encode.int (sumMarkedPoints model.entries) )
                    ]
              )
            ]
    

    【讨论】:

    • 谢谢。我也改变了: [ ( "name", Encode.string model.name ) , ( "score", Encode.int (sumMarkedPoints model.entries) ) ] 现在 Rails 抱怨:Bad payload"localhost:3000/scores", body = "{ \"id\":null,\"name\":\"Mike\",\"score\":220}" }
    • 好的,我做到了..它看起来像是一个名称冲突表 model.score&&item.score。重命名为点后..作品..感谢帮助
    【解决方案2】:

    避免名称冲突..

     encodeScore : Model -> Encode.Value
     encodeScore model =
        Encode.object
         [ ( "score"
          , Encode.object
                [ ( "name", Encode.string model.name )
                , ( "points", Encode.int (sumMarkedPoints 
                    model.entries) )
                ]
          )
        ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多