Rails U JS по умолчанию отправляет удаленные запросы с типом контента application/javascript
.
Если вы хотите запросить JSON, вы присоединяете атрибут data-type="json"
к элементу:
= form_for @thing, remote: true, html: { id: 'thing' }, data: { type: "json" } do |f|
= f.text_field :name
= f.submit 'submit'
Существует также проблема Turbolinks. Ваш код присоединяет обработчик событий непосредственно к элементам:
$('#thing').on('ajax:success', function(e, data, status, xhr) {
console.log(data)
};
Хотя это будет работать при начальной загрузке страницы., Он не будет работать, когда Turbolinks заменяет содержимое страницы на Ajax. Вместо этого вам нужно создать идемпотентный обработчик события :
$(document).on('ajax:success', '#thing', function(e, data, status, xhr) {
console.log(data);
}).on('ajax:error', '#thing', function(e, xhr, status, error){
console.log(error);
});
. Он присоединяет обработчик события к самому документу, который будет перехватывать событие, когда оно всплывает в DOM. Таким образом, вам не нужно заключать этот код в $(document).ready(function(){ ... });
.
. Вы также должны возвращать значимые коды ответов HTTP - вот что будет определять, будет ли Rails U JS запускать 'ajax:success'
или 'ajax:error'
. Не JSON сообщения, которые являются анти-паттерном.
def create
@thing = Thing.new(thing_params)
if @thing.save
# Tell the client where the newly created object can be found
head :created, location: @thing
# or return a json representation of the object
render json: @thing, status: :created
else
# just return a header
head :unprocessable_entity
# or return a JSON object with the errors
render json: { errors: @thing.errors }, status: :unprocessable_entity
end
end