0

Handsontable jquery プラグインを使用して、データグリッド内のセルを変更しています。Handsontable は、次のように配列でデータを送信します。

var change = [['Z', null, 'X']]

次に、ajax を使用してこのデータをサーバーに渡します。

$.ajax({
  url: "/incomes",
  dataType: "text",
  type: "POST",
  data: { data: change },
});

問題は、null 値を使用すると、ajax がこの値を無視し、次のように配列を変更することです。

change[0][0]    Z
change[0][1]    
change[0][2]    X

配列内のこの値は null であるため、Webrick は次のエラーをスローします。 Internal Server Error expected Hash (got Array) for param 0

データをループして (実際の例では複数の配列があります)、これらの null 値を変更することは避けたいと思っています。エラーなしでデータをサーバーに送信できるようにする簡単な方法はありますか?

HTML エラー:

内部サーバーエラー

パラメータ '0' の期待されるハッシュ (配列を取得)
WEBrick/1.3.1 (Ruby/1.9.3/2012-11-10) ローカルホスト:3000

端末エラー:

ERROR TypeError: expected Hash (got Array) for param `0'
    /home/g/.rvm/gems/ruby-1.9.3-p327/gems/rack-1.4.4/lib/rack/utils.rb:127:in `normalize_params'
    /home/g/.rvm/gems/ruby-1.9.3-p327/gems/rack-1.4.4/lib/rack/utils.rb:128:in `normalize_params'
    /home/g/.rvm/gems/ruby-1.9.3-p327/gems/rack-1.4.4/lib/rack/utils.rb:96:in `block in parse_nested_query'
    /home/g/.rvm/gems/ruby-1.9.3-p327/gems/rack-1.4.4/lib/rack/utils.rb:93:in `each'
    /home/g/.rvm/gems/ruby-1.9.3-p327/gems/rack-1.4.4/lib/rack/utils.rb:93:in `parse_nested_query'
    /home/g/.rvm/gems/ruby-1.9.3-p327/gems/rack-1.4.4/lib/rack/request.rb:332:in `parse_query'
    /home/g/.rvm/gems/ruby-1.9.3-p327/gems/rack-1.4.4/lib/rack/request.rb:209:in `POST'
    /home/g/.rvm/gems/ruby-1.9.3-p327/gems/rack-1.4.4/lib/rack/methodoverride.rb:26:in `method_override'
    /home/g/.rvm/gems/ruby-1.9.3-p327/gems/rack-1.4.4/lib/rack/methodoverride.rb:14:in `call'
    /home/g/.rvm/gems/ruby-1.9.3-p327/gems/rack-1.4.4/lib/rack/runtime.rb:17:in `call'
    /home/g/.rvm/gems/ruby-1.9.3-p327/gems/activesupport-3.2.9/lib/active_support/cache/strategy/local_cache.rb:72:in `call'
    /home/g/.rvm/gems/ruby-1.9.3-p327/gems/rack-1.4.4/lib/rack/lock.rb:15:in `call'
    /home/g/.rvm/gems/ruby-1.9.3-p327/gems/actionpack-3.2.9/lib/action_dispatch/middleware/static.rb:62:in `call'
    /home/g/.rvm/gems/ruby-1.9.3-p327/gems/railties-3.2.9/lib/rails/engine.rb:479:in `call'
    /home/g/.rvm/gems/ruby-1.9.3-p327/gems/railties-3.2.9/lib/rails/application.rb:223:in `call'
    /home/g/.rvm/gems/ruby-1.9.3-p327/gems/rack-1.4.4/lib/rack/content_length.rb:14:in `call'
    /home/g/.rvm/gems/ruby-1.9.3-p327/gems/railties-3.2.9/lib/rails/rack/log_tailer.rb:17:in `call'
    /home/g/.rvm/gems/ruby-1.9.3-p327/gems/rack-1.4.4/lib/rack/handler/webrick.rb:59:in `service'
    /home/g/.rvm/rubies/ruby-1.9.3-p327/lib/ruby/1.9.1/webrick/httpserver.rb:138:in `service'
    /home/g/.rvm/rubies/ruby-1.9.3-p327/lib/ruby/1.9.1/webrick/httpserver.rb:94:in `run'
    /home/g/.rvm/rubies/ruby-1.9.3-p327/lib/ruby/1.9.1/webrick/server.rb:191:in `block in start_thread'
4

1 に答える 1

3

これは暗闇での刺し傷ですが、JSON またはその他のコンテンツ タイプを使用して POST を実行してみてください。

$.ajax({
  url: "/incomes",
  dataType: "text",
  type: "POST",
  data: JSON.stringify({ data: change }),
  contentType: 'application/json'
});

JSON 形式はデフォルトの x-www-form-urlencoded 形式よりも null 値とネストされた配列をより自然に (IMO) 表現できるため、これを解決策として提案します。

仕組み

JSON.stringifyデータが JSON としてシリアル化されていることを確認します。contentTypeこのような設定を使用すると、HTTP リクエストで Content-Type ヘッダーが「application/json」になります。Rails はこれを手がかりとして、受信した POST 本文を JSON として解釈します。

于 2013-01-23T18:16:29.567 に答える