私のアプリには、典型的なフラット オブジェクトではなく、大きなネストされたオブジェクトである Backbone モデルがあり、ネストされた部分は MySQL データベースの TEXT 列に保存されます。
Rails API で JSON のエンコード/デコードを処理して、一部が文字列化された JSON テキストとして保存されている場合でも、外部からこの 1 つの大きなネストされた JSON オブジェクトを POST/GET できるように見えるようにしたいと考えました。
しかし、Rails が空の配列を魔法のように値に変換するという問題に遭遇しましたnil
。たとえば、これを POST すると:
{
name: "foo",
surname: "bar",
nested_json: {
complicated: []
}
}
私の Rails コントローラーはこれを認識します:
{
:name => "foo",
:surname => "bar",
:nested_json => {
:complicated => nil
}
}
そして、JSON データが変更されました。
これまでにこの問題に遭遇した人はいますか? Rails が POST データを変更するのはなぜでしょうか?
アップデート
彼らがそれを実行する場所は次のとおりです。
https://github.com/rails/rails/blob/master/actionpack/lib/action_dispatch/http/request.rb#L288
そして、彼らがそうする理由は次の通りです:
https://github.com/rails/rails/pull/8862
それで、問題は、ネストされた JSON API の状況でこれをどのように最適に処理するかということです。
ベストアンサー1
いろいろ調べた結果、Rails 4.1以降ではdeep_munge「機能」を完全にスキップできることが分かりました。
config.action_dispatch.perform_deep_munge = false
ドキュメントは見つかりませんでしたが、このオプションの紹介はここでご覧いただけます:https://github.com/rails/rails/commit/e8572cf2f94872d81e7145da31d55c6e1b074247
そうすることでセキュリティ上のリスクが発生する可能性があります。詳細は以下を参照してください。https://groups.google.com/forum/#!topic/rubyonrails-security/t1WFuuQyavI