Вывод jSON в приложении rails

ok, рельсы 3 новых разработчика здесь.

Я хочу, чтобы мой jquery смог получить объект json из приложения rails 3 для проектов. Вот мой контроллер.

def yourprojects
  @projects = Projects.all(current_user)

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

Я добавил строку format.json... в jquery у меня есть:

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

Итак, это должно работать, я думал. Вместо этого сервер возвращается: "Шаблон отсутствует" "Отсутствует шаблон,, с помощью {: locale = > [: en,: en],: handlers = > [: rjs,: rhtml,: builder,: rxml,: erb],: formats = > [: html]} в пути просмотра"

Вам нужен шаблон для возврата jsOn? не должно ли rails 3 app знать, как отформатировать json?

Файл маршрутов:

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

Ответ 1

Вы можете установить заголовок Accept: application/json для реального REST, или вы можете добавить формат URL для быстрого хакера:

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

Ответ 2

Это не проблема с Rails, а скорее AJAX/jQuery, не отправляющая заголовок Accept: Попробуйте следующее:

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

Если все ваши запросы AJAX ожидают JSON, вы можете настроить заголовок глобально:

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

Другим вариантом будет добавление .json в путь или data:{format: 'json'} в $.ajax хеш опций. Rails поддерживает суффиксы пути формата по умолчанию для маршрутизации resoures. Просто попробуйте rake routes, чтобы видеть.

Ответ 3

:formats=>[:html]

Это говорит о том, что сервер думает, что запрашивается html. Попробуйте добавить .json к вашему пути (и возможному маршруту), и это заставит формат. Чтобы сделать это, понадобится маршрут примерно так:

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

Как бы то ни было, params[:format] должен быть "json" для этого запроса, чтобы обработчики формата могли делать правильные вещи.