2009-05-25 3 views
15

Je suis en train d'envoyer une requête PUT jQuery Ajax qui ressemble à ceci:Comment mettre les données JSON dans Ruby on Rails en utilisant jQuery?

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

Mon contrôleur ressemble à peu près comme ceci:

 respond_to do |format| 
     if @page.update_attributes params[:page] 
      format.html{ ... } 
      format.json{ render :json => {:saved => 'ok'}.to_json } 
     else 
      format.html{ ... } 
      format.json{ render :json => {:saved => 'fail'}.to_json } 
     end 
     end 

mais je reçois l'erreur suivante.

l'erreur est survenue lors de l'évaluation nil.name merge_element!' /Library/Ruby/Gems/1.8/gems/activesupport-2.3.2/lib/active_support/xml_mini/rexml.rb:18:in /Library/Ruby/Gems/1.8/gems/activesupport-2.3.2/lib/active_support/xml_mini/rexml.rb:29:in parse » (DELEGATION): 2: __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' ... C'est comme si Ruby on Rails essayait d'analyser les paramètres en XML, mais je veux utiliser JSON!

Que dois-je faire pour mettre JSON à Ruby on Rails?

+1

Mettez à jour votre question initiale en l'éditant au lieu de poser une nouvelle question: http://stackoverflow.com/questions/907910/how- Do-i-put-data-to-rails-using-jquery Les données – tvanfosson

Répondre

5

Vous devez définir contentType dans vos options. contentType est ce que vous envoyez. dataType est ce que vous attendez. Vous devriez lire attentivement le documentation on the options argument to ajax.

+0

doivent également être sérialisées. Voir ma réponse –

7

La définition du type de contenu n'a pas fonctionné pour moi. Je recevais une chaîne à la place d'un hachage pour les params [: page].

Je résolus comme ceci:

Stringifying l'objet JSON avec un script trouvé à JSON en JavaScript:

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

Sur Ruby côté Rails, un petit bijou de JSON doit être nécessaire . Dans le contrôleur:

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

Ce n'est pas joli du tout, mais cela a fonctionné pour moi.

+0

Soyez prudent avec ceci - PUT n'est pas supporté par tous les navigateurs. Certains ne font que GET et POST, je ne sais pas lequel. – skaffman

+0

L'analyse sera effectuée automatiquement par Rails si vous définissez contentType. Voir ma réponse –

2

Si vous ne voulez pas ajouter des scripts, vous pouvez faire

$.parseJSON("some_jsonish_string") 
1

Vous devez définir contentType-"application/json" dans vos options; dataType est seulement ce que vous attendez de retour.

De plus, vous devez sérialiser votre champ data utilisant JSON.stringify:

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