Ответ 1
Вы можете установить заголовок Accept: application/json
для реального REST, или вы можете добавить формат URL для быстрого хакера:
$.ajax({url: '/projects/yourprojects.json', dataType: 'json'});
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
Вы можете установить заголовок Accept: application/json
для реального REST, или вы можете добавить формат URL для быстрого хакера:
$.ajax({url: '/projects/yourprojects.json', dataType: 'json'});
Это не проблема с 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
, чтобы видеть.
:formats=>[:html]
Это говорит о том, что сервер думает, что запрашивается html
. Попробуйте добавить .json
к вашему пути (и возможному маршруту), и это заставит формат. Чтобы сделать это, понадобится маршрут примерно так:
map.your_projects '/projects/yourprojects.:format',
:controller => 'projects',
:action => 'yourprojects'
Как бы то ни было, params[:format]
должен быть "json"
для этого запроса, чтобы обработчики формата могли делать правильные вещи.