2010-09-26 5 views
10

ok, rails 3 nouveau développeur ici.Sortie de jSON dans une application rails

Je veux que ma jquery puisse obtenir un objet json depuis l'application rails 3 pour projets. Voici mon contrôleur.

def yourprojects 
    @projects = Projects.all(current_user) 

    respond_to do |format| 
    format.html # index.html.erb 
    format.json { render :json => @projects } 
    end 
end 

I ajouté la ligne de format.json ... en jquery j'ai:

$.ajax({url: '/projects/yourprojects', dataType: 'json'}); 

Alors que travaillerais je pensais. Au lieu de cela, le serveur renvoie: "Modèle manquant" "Modèle manquant ,,,, avec {: locale => [: en,: en],: handlers => [: rjs,: rhtml,: builder,: rxml,: erb],: formats => [: html]} dans les chemins d'accès "

avez-vous besoin d'un modèle pour un retour jsOn? l'application rails 3 ne devrait-elle pas savoir comment formater le json?

Routes du fichier:

resources :projects do 
    collection do 
     get 'yourprojects' 
    end 
end 

Répondre

6

Vous pouvez définir l'en-tête Accept: application/json pour de vrai repos, ou vous pouvez ajouter le format à l'URL rapide carriole:

$.ajax({url: '/projects/yourprojects.json', dataType: 'json'}); 
+0

c'est génial - et ça marche! wooow merci. Je ne pouvais pas trouver cela n'importe où sur Google! J'aime l'idée d'utiliser l'acceptation, maintenant j'ai ceci en haut de mon fichier JS ($ .ajaxSetup ({'beforeSend': fonction (xhr) {xhr.setRequestHeader ("Accepter", "texte/javascript") }})) .... Le problème est une requête ajax j'ai besoin d'une réponse .js. les autres je veux JSON.Quelle est la façon intelligente de gérer cela? Merci! – WozPoz

0
:formats=>[:html] 

qui dit que le serveur pense que html est demandée. Essayez d'ajouter un .json à votre chemin (et itinéraire possible) et cela forcera le format. À faire cela aurait besoin d'un quelque chose de route comme ceci:

map.your_projects '/projects/yourprojects.:format', 
    :controller => 'projects', 
    :action => 'yourprojects' 

D'une certaine manière, someway, le params[:format] devrait être "json" pour cette demande afin que les gestionnaires de format peuvent faire la bonne chose.

+0

Merci squeegy, mais est-ce pour Rails 3? Ma config/routes ressemble à ceci pour tenir compte (également ajouté à la question ci-dessus): Ressources: Les projets ne collection faire get fin fin – WozPoz

+0

Aussi, je pensais que Rails « yourprojects » 3 était assez intelligent pour déterminer le type de demande et servir la bonne réponse, c'est-à-dire pourquoi vous pouvez avoir autant de différents types de réponses (html, js, json, xml)? – WozPoz

+0

Je suis en fait un peu en retard et je ne sais pas comment fonctionnent les routes Rails 3. Mais 2.x a travaillé comme je le décris. Pardon! –

5

Ce n'est pas question de Rails, mais plutôt AJAX/jQuery ne pas envoyer en-tête Accept: Essayez ceci:

$.ajax({ 
    url: 'url_to_action', dataType: "json", 
    beforeSend : function(xhr){ 
     xhr.setRequestHeader("Accept", "application/json") 
    }, 
    success : function(data){ 
     //.. do something with data 
    }, 
    error: function(objAJAXRequest, strError, errorThrown){ 
     alert("ERROR: " + strError); 
    } 
    } 
); 

Si toutes vos requêtes AJAX attendent JSON, vous pouvez définir en-tête au niveau mondial:

$.ajaxSetup({ 
    dataType: 'json', 
    'beforeSend' : function(xhr){ 
    xhr.setRequestHeader("Accept", "application/json") 
    } 
}); 

L'autre option serait d'ajouter .json au chemin ou data:{format: 'json'} au $.ajax hash d'options. Rails prend en charge les suffixes de chemin de format par défaut pour le routage resoures. Essayez simplement rake routes pour voir.

Questions connexes