2010-09-26 17 views
10

ok, rails 3 nuevo desarrollador aquí.Salida de jSON en una aplicación de rieles

Quiero que mi jquery pueda obtener un objeto json de la aplicación rails 3 para proyectos. Aquí está mi controlador.

def yourprojects 
    @projects = Projects.all(current_user) 

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

I añadido la línea format.json ... en jQuery que tengo:

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

por lo que debe trabajar lo que pensaba. En cambio, el servidor está volviendo: "Falta la plantilla" "Plantilla faltante ,,,, con {: locale => [: en,: en],: handlers => [: rjs,: rhtml,: builder,: rxml,: erb],: formats => [: html]} en las rutas de acceso "

¿necesita una plantilla para un retorno jsOn? ¿la aplicación Rails 3 no debería saber cómo formatear el json?

Rutas del archivo:

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

Respuesta

6

puede establecer el encabezado Accept: application/json para un verdadero descanso, o puede agregar el formato de la dirección URL de hackery rápida:

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

que es increíble, ¡y funcionó! Gracias, gracias. ¡No pude encontrar esto en ninguna parte de Google! Me gusta la idea de usar el accept, en este momento tengo esto en la parte superior de mi archivo JS ($ .ajaxSetup ({'beforeSend': function (xhr) {xhr.setRequestHeader ("Accept", "text/javascript") }})) .... El problema es alguna petición de Ajax. Necesito una respuesta .js. otros quiero JSON.¿Cuál es la forma inteligente de manejar esto? ¡Gracias! – WozPoz

0
:formats=>[:html] 

Eso indica que el servidor está pensando que se solicita html. Intente agregar un .json a su ruta (y ruta posible) y eso forzará el formato. Para hacer eso se necesitaría una ruta algo como esto:

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

De alguna manera, la params[:format] debería ser "json" para esta solicitud por lo que los manipuladores de formato pueden hacer lo correcto.

+0

Gracias Squeegy, pero es esto para Rails 3? Mi config/routes se ve así para acomodar (también se agregó a la pregunta anterior): recursos: proyectos do colección do get 'yourprojects' final final – WozPoz

+0

Además, pensé que Rails 3 era lo suficientemente inteligente como para determinar el tipo de solicitud y servir la respuesta correcta, es decir, ¿por qué puede tener tantos tipos diferentes de tipos de respuesta (html, js, json, xml)? – WozPoz

+0

Estoy un poco retrasado y no estoy seguro de cómo funcionan las rutas de Rails 3. Pero 2.x funcionó como describo. ¡Lo siento! –

5

Esto no es cuestión de rieles sino AJAX/jQuery no enviar Acepta el encabezado: Prueba esto:

$.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 todas sus peticiones AJAX esperan JSON, entonces se puede establecer la cabecera a nivel mundial:

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

Otra opción sería agregar .json a la ruta o data:{format: 'json'} a $.ajax hash de opciones. Rails admite sufijos de ruta de formato de forma predeterminada para el enrutamiento resoures. Solo prueba rake routes para ver.

Cuestiones relacionadas