web-dev-qa-db-fra.com

Comment puis-je transmettre des données à Rails à l'aide de JQuery

J'essaie d'envoyer une demande jquery ajax PUT qui ressemble à ceci:

$.ajax({
          type: "PUT",
          url: '/admin/pages/1.json',
          data: { page : {...} },
          dataType: 'json',
          success: function(msg) {
            alert( "Data Saved: " + msg );
          }
});

mais j'obtiens l'erreur suivante:

The error occurred while evaluating nil.name
    /Library/Ruby/Gems/1.8/gems/activesupport-2.3.2/lib/active_support/xml_mini/rexml.rb:29:in `merge_element!'
    /Library/Ruby/Gems/1.8/gems/activesupport-2.3.2/lib/active_support/xml_mini/rexml.rb:18:in `parse'
    (__DELEGATION__):2:in `__send__'
    (__DELEGATION__):2:in `parse'
    /Library/Ruby/Gems/1.8/gems/activesupport-2.3.2/lib/active_support/core_ext/hash/conversions.rb:154:in `from_xml' ... ...

Est-ce que Rails essaie d'analyser les paramètres en tant que XML, mais je veux utiliser JSON !!

Que dois-je faire pour mettre JSON sur des rails?

49
Macario Ortega

PUT et DELETE ne sont pas pris en charge par tous les navigateurs. RubyOnRails prend en charge le passage d’un paramètre supplémentaire avec vos données appelé _method , qui indiquera comment RoR traitera la demande.

$.ajax({
          type: "POST",
          url: '/admin/pages/1.json',
          data: { _method:'PUT', page : {...} },
          dataType: 'json',
          success: function(msg) {
            alert( "Data Saved: " + msg );
          }
});
84
duckyflip

Le paramètre dataType dans jQuery n'est pas ce que vous envoyez, mais spécifie plutôt le format auquel vous souhaitez que la answer soit (oui, c'est un très mauvais nom). Si vous souhaitez envoyer vos données au serveur dans un format autre que application/x-www-form-urlencoded, vous devez utiliser contentType param. Vous devez également sérialiser votre data:

$.ajax({
      type: "PUT",
      url: '/admin/pages/1.json',
      data: JSON.stringify({...}),
      contentType: 'application/json', // format of request payload
      dataType: 'json', // format of the response
      success: function(msg) {
        alert( "Data Saved: " + msg );
      }
});
36
lqc

Ok, en fait, mes données JSON n'avaient pas la clé de page, c'est une erreur. Donc c'est pourquoi il n'a pas été correctement analysé. Mais maintenant, je reçois la chaîne "[object Object]" comme valeur pour la clé de page au lieu d'un objet json joliment analysé.

Où devrais-je regarder: JQuery ou Rails?

MODIFIER:

J'ai résolu mon problème en stratifié l'objet json avec un script trouvé ici: www.json.org/js.html:

$.ajax({
      type: "PUT",
      url: '/admin/pages/1.json',
      data: { page : JSON.stringify( {...} ) },
      dataType: 'json',
      success: function(msg) {
        alert( "Data Saved: " + msg );
      }
});

Du côté des rails json gem doit être requis. Dans le contrôleur:

 params[:page] = JSON.parse params[:page] if params[:page].is_a? String
5
Macario Ortega

J'ai eu un problème similaire [objet Object] avec jQuery/Rails, mais avec HTML plutôt que JSON. Cela aidera peut-être -

param de [object Object]

data: { lesson: { date: drop_date } }

param de lesson[date]

data: { "lesson[date]": drop_date }

j'espère que cela t'aides -

1
theschmitzer
var id = $('#route_id').val()
$.ajax({
    type: 'PUT',
    url:  '/routes/'+ id,
    data: $('#markerform').serializeArray(),
    dataType: "JSON",
    success: function(data) {
        console.log(data);
    }
});
1

Vous avez probablement juste besoin de définir les en-têtes de demande sur jQuery.

jQuery.ajaxSetup({ 
  'beforeSend': function(xhr) {
    xhr.setRequestHeader("Accept", "text/javascript");
  }
})
0
Carlos A. Cabrera