Ответ 1
Это решение не сработало для меня (рельсы 3.1 + coffeescript). После поиска довольно много, я нашел хороший способ сделать это, и я хотел поделиться:
Просто добавьте ".js" в конец URL-адреса. Так просто...; -)
У меня есть стандартный контроллер, который настроен для ответа на запросы HTML, JS и JSON:
def picture
@picture = Picture.new params[:picture]
respond_to do |format|
if @picture.save
format.html do
logger.debug "In the HTML responder"
redirect_to @picture
end
format.json { render json: @picture, status: :created, location: @picture }
format.js { render :nothing => true }
else
# you get the idea
end
end
end
Теперь я пытаюсь отправить запрос этому контроллеру с помощью функции $.ajax
(я не могу использовать :remote => true
в этой конкретной ситуации - я пытаюсь выполнить загрузку файла ajax).
$.ajax({
url: $("form#new_picture").attr("action"),
type: "POST",
data: formdata,
processData: false,
contentType: false
});
Проблема заключается в том, что по какой-либо причине мой запрос обрабатывается как HTML-запрос. Как сообщить рельсы, что я хочу получить ответ JS?
Кстати, я использую jquery_ujs в моем проекте, поэтому у меня есть доступ к методам, которые он предоставляет при необходимости. Я не очень хорошо разбираюсь в JS, чтобы настроить это, чтобы делать то, что мне нужно здесь.
Это решение не сработало для меня (рельсы 3.1 + coffeescript). После поиска довольно много, я нашел хороший способ сделать это, и я хотел поделиться:
Просто добавьте ".js" в конец URL-адреса. Так просто...; -)
Просто добавьте dataType: 'script'
$.ajax({
url: $("form#new_picture").attr("action"),
type: "POST",
data: formdata,
processData: false,
contentType: false,
dataType: 'script'
});
Вы должны установить заголовок "accept" перед отправкой запроса ajax, чтобы Rails знал, как отвечать.
$.ajax({
url: $("form#new_picture").attr("action"),
type: "POST",
data: formdata,
processData: false,
contentType: false,
beforeSend: function(xhr, settings) {
xhr.setRequestHeader('accept', '*/*;q=0.5, ' + settings.accepts.script);
}
});
Добавьте dataType: 'script'
и в данных формы добавьте параметр format: 'js'
следующим образом:
$.ajax({
url: '/manager/consumers/url',
type: 'GET',
dataType: 'script',
data: {
authenticity_token: '<%= form_authenticity_token %>',
param_1: '1',
param_2: '2',
format: 'js'
}
});
также добавить в контроллер, чтобы не отображать макет:
respond_to do |format|
format.xls
format.js { render :layout => false }
end
Вы можете проверить, является ли это xhr-запросом и отображать формат, который вы предпочитаете. Например;
if request.xhr?
render :json => {
:some_data => 'bla'
}
end
Хотя, возможно, напрямую не отвечая на вопрос, я столкнулся с этим с аналогичной проблемой, и другие могут найти это полезным. Особенно, если вы используете haml.
После многих попыток (включая добавление .js к URL) единственное, что сработало для меня, - это отключение средства отображения макета при возврате ответа script.
respond_to do |format|
format.html
format.js { render layout: false }
end
Моя проблема заключалась в том, что ответ AJAX был полной html-страницей, созданной механизмом шаблона макета рельсов. Это означало, что мой javascript в моем thing.js.erb
не выполнялся. Отключение макета означало, что был возвращен только javascript (вы можете найти возврат на вкладке сети браузеров панели разработчика), которая позволила ему выполнить.
Я использую haml как средство рендеринга по умолчанию, и я считаю, что именно поэтому мне нужно явно отключить макет в js renders (я предположил, что он будет автоматическим).
Итак, если ничего не сработало и вы используете haml, попробуйте это.
Установите contentType
как "text/javascript"
$.ajax({
url: $("form#new_picture").attr("action"),
type: "POST",
data: formdata,
processData: false,
contentType: "text/javascript"
});