Насколько я понимаю, response_to bock состоит в том, что когда вы делаете запрос AJAX, он должен отвечать, используя json, а если вы делаете обычный запрос, он должен отвечать, используя html. Это верно?
Не совсем. Запрос AJAX - это просто асинхронный запрос, а тип ответа должен зависеть от заголовков Content-Type и Accept-Type. Запрос запроса AJAX может фактически запрашивать любой возможный тип контента - JSON является наиболее часто используемым и, возможно, наиболее полезным типом.
Если запрос не содержит определенного типа контента c или Тип принятия Rails по умолчанию будет html, если вы не переопределите его в маршрутах:
namespace :api, defaults: { format: :json } do
namespace :v1 do
resources :things
end
end
Rails U JS, который встроен в рельсы и поддерживает параметр remote: true
в формах и ссылках, который фактически использует application/javascript
в качестве типа содержимого по умолчанию, поскольку он позволяет писать js.erb
представления и повторно использовать шаблоны рельсов без написания обработчиков ajax. Если это действительно идея хорошая, хотя это спорно, поскольку это приводит к очень сомнительных проектных решений
1014 * С Rails U JS самый простой способ установить тип контента через * атрибут * 1015:.
<%= link_to "Click Me!", "/foo", remote: true, data: { type: :json } %>
<%= form_with(model, html: { data: { type: "json" }}) %>
Если вы отправляете запрос Ajax «вручную» с помощью XMLHttpRequest, вы можете установить тип контента с помощью setRequestHeader
.
xhr.setRequestHeader("Content-Type", "application/json");
С jQuery вы используете type:
вариант для функций ajax или jQuery.getJSON
.
Также правильный способ ответить на успешный запрос POST - это 201 Created.
201 Создано. Запрос был выполнен, и в результате был создан один или несколько новых ресурсов. Первичный ресурс, созданный запросом, идентифицируется либо полем заголовка Location в ответе, либо, если поле Location не получено, действующим URI запроса.
format.json { head :created, location: @role }
Вы также можете дополнительно включить созданный ресурс в теле ответа.
format.json { render json: @role, location: @role, status: :created }