Подтвердить что ты не робот

Запрос jQuery ajax не вызывает ответ JS от контроллера rails?

У меня есть стандартный контроллер, который настроен для ответа на запросы 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, чтобы настроить это, чтобы делать то, что мне нужно здесь.

4b9b3361

Ответ 1

Это решение не сработало для меня (рельсы 3.1 + coffeescript). После поиска довольно много, я нашел хороший способ сделать это, и я хотел поделиться:

Просто добавьте ".js" в конец URL-адреса. Так просто...; -)

Ответ 2

Просто добавьте dataType: 'script'

$.ajax({
  url: $("form#new_picture").attr("action"),
  type: "POST",
  data: formdata,
  processData: false,
  contentType: false,
  dataType: 'script'
});    

Ответ 3

Вы должны установить заголовок "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);
  }
});

Ответ 4

Добавьте 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

Ответ 5

Вы можете проверить, является ли это xhr-запросом и отображать формат, который вы предпочитаете. Например;

if request.xhr?
  render :json => {
    :some_data => 'bla'
  }
end

Ответ 6

Хотя, возможно, напрямую не отвечая на вопрос, я столкнулся с этим с аналогичной проблемой, и другие могут найти это полезным. Особенно, если вы используете 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, попробуйте это.

Ответ 7

Установите contentType как "text/javascript"

$.ajax({
  url: $("form#new_picture").attr("action"),
  type: "POST",
  data: formdata,
  processData: false,
  contentType: "text/javascript"
});