2010-03-16 9 views
0

J'essaie actuellement d'utiliser AJAX dans mon application via jRails. J'essaie de retourner un objet JSON de mon contrôleur, puis l'analyser dans mon Javascript. J'utilise json2.js pour faire l'analyse.Utilisation de JSON avec jRails

Voici le code que j'ai actuellement:

function getSomething() 
{ 
    $.ajax({ 
     type: "GET", 
     url: "map/testjson", 
     success: function(data) { 
      var myData = JSON.parse(data[0]); 
      window.alert(myData.login); 
     } 
    }); 
} 

et dans le contrôleur:

class Map::MapController < ApplicationController 
    def index 
    end 

    def testjson 
    @message = User.find(:all) 
    ActiveRecord::Base.include_root_in_json = false 
    respond_to do |w| 
     w.json { render :json => @message.to_json } 
    end 

    end 
end 

Le window.alert dit simplement 'non défini' (sans tics).

Cependant, si je change le javascript pour window.alert (données) (l'objet brut retourné par le contrôleur) je reçois:

[{ "sel": "Asalt", "name": "", "created_at": "2010-03-15T02: 34: 25Z", "remember_token_expires_at": null, "mot de passe crypté": "aPassword", "updated_at": "2010-03-15T02: 34: 25Z », "id": 1, "remember_token": null, "login": "zgwrig2", "email": "[email protected]"}]

Cela ressemble à un tableau de taille 1 , si je Je le regarde correctement, mais j'ai essayé à peu près toutes les combinaisons de JSON.parse sur l'objet de données que je peux penser, et rien ne semble fonctionner.

Des idées sur ce que je fais mal ici?

EDIT Cela semble fonctionner correctement s'il y a plusieurs lignes dans la table Utilisateurs.

+0

Zachary, quelle version de jQuery utilisez-vous? –

+0

On dirait que 1.3.2 est ce qui vient avec jRails. –

Répondre

0

Lorsqu'il y a plus d'une ligne, ce que vous avez affaire est une chaîne de votre objet au format json, pas votre représentation d'objet json. Vraiment désolé pour moi l'anglais, je veux expliqué mieux ...

Et si @message est un objet nul, parce qu'il n'y a pas de message, le rendu à json ne fait rien, et quand vous êtes dans votre JS, vous aura un problème parce que vous n'avez aucune réponse quel travailleur. Vous devez vérifier votre objet @message. Peut-être que vous pouvez le faire:

w.json {render: json => (@ message.nil?)?0: @checkpoint}

Ensuite, dans votre fonction de rappel, vous devez vérifier si votre réponse est "0" (comme une chaîne) ou un objet.

0

Je peux voir ce que vous avez 2 problèmes dans votre code.

Il est préférable d'utiliser $ .getJSON pour faire une requête JSON.

  1. jQuery est encore un analyseur de JSON ... puis dans votre fonction de rappel, vous ne devez faire:

$ (données) .Chaque (fonction (i, utilisateur) {// ce vous aimez faire avec un utilisateur });

  1. Dans votre réponse de rails il y a une erreur, n'est pas un w.json {render: json => @ message.to_json}, est seulement w.json {render: json => @message }. Sans ".to_json".

Espérons que ça aide.

+0

J'ai effectivement supprimé la partie ".to_json", mais elle devrait être optionnelle. La fonction de rappel explicite pour gérer chaque paire de valeurs de nom est également supposée être optionnelle ... L'étrange est que mon code fonctionne bien quand il y a plus d'une ligne rendue dans json. –

Questions connexes