2010-09-26 8 views
10

ok ausgeben, Schienen 3 neue Entwickler hier.JSon in einer Rails-Anwendung

Ich mag meine Jquery Lage sein, ein JSON-Objekt von den Schienen 3-Anwendung für Projekte zu erhalten. Hier ist mein Controller.

def yourprojects 
    @projects = Projects.all(current_user) 

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

Ich habe die format.json Linie ... in jquery Ich habe:

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

das sollte also funktionieren, dachte ich. Stattdessen wird der Server zurückgibt: „Vorlage fehlt "Vorlage fehlt" ,,,, mit {: locale => [: en, en]: Handler => [: rjs,: rhtml,: Baumeister,: rxml,: erb]: Formate => [: html]} in Sicht Pfade“

benötigen Sie eine Vorlage für eine JSON zurück? sollte die rails 3 app nicht wissen, wie man den json formatiert? Die Datei

Routen:

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

Antwort

6

Sie können die Accept: application/json Header für echte REST eingestellt, oder Sie können das Format der URL für eine schnelle Hacks hinzufügen:

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

völlig anders ist, das ist genial - und hat funktioniert! Wow, danke. Ich konnte das nirgendwo auf Google finden! Ich mag die Idee, mit der nehmen, jetzt habe ich diese auf der Spitze meiner JS-Datei ($ .ajaxSetup ({ 'beforeSend': function (XHR) {xhr.setRequestHeader ("Übernehmen", "text/javascript") }})) .... Problem ist eine Ajax-Anfrage Ich brauche eine .js Antwort. andere möchte ich JSON.Was ist der kluge Weg, damit umzugehen? Vielen Dank! – WozPoz

0
:formats=>[:html] 

, dass der Server sagt denkt, dass html angefordert wird. Versuchen Sie, eine .json zu Ihrem Pfad (und mögliche Route) hinzuzufügen, und das wird das Format erzwingen. Um das zu erreichen wäre eine Route so etwas wie dies müsse:

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

Irgendwie someway sollte die params[:format] seine "json" für diese Anforderung, so dass die Format-Handler, das Richtige tun.

+0

Dank Squeegy, aber das ist für Rails 3? Meine config/routes sieht so aus (auch zur obigen Frage hinzugefügt): resources: projects do collection do bekomme 'yourprojects' end end – WozPoz

+0

Auch dachte ich, Rails 3 war schlau genug, um den Anforderungstyp zu bestimmen und die richtige Antwort, dh warum können Sie so viele verschiedene Typen von Antworttypen haben (html, js, json, xml)? – WozPoz

+0

Ich bin eigentlich ein bisschen zurück und nicht sicher, wie Rails 3 Routen funktionieren. Aber 2.x hat funktioniert, wie ich es beschrieben habe. Es tut uns leid! –

5

Das ist nicht Thema der Rails ist, sondern AJAX/jQuery Senden nicht Accept-Header: Try this:

$.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); 
    } 
    } 
); 

Wenn alle Ihre AJAX-Anfragen JSON erwarten, dann können Sie Header global gesetzt:

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

Andere Option würde hinzufügen .json zu Pfad oder data:{format: 'json'} zu $.ajax Hash-Optionen. Rails unterstützt Formatpfad-Suffixe standardmäßig für resoures Routing. Versuchen Sie einfach rake routes zu sehen.