Визуализация прототипа Rails 3: ответ на обновление имеет тип содержимого text / html - PullRequest
4 голосов
/ 31 января 2012

Я пытаюсь заставить RJS-код, написанный на прототипе и Rails 2.3.11, работать в Rails 3.2.1

У меня есть гем prototype-rails, поэтому render :update do |page| работает, я использую форму с :remote => true, которая отправляет ajax-запрос в контроллер, и javascript выглядит так, как будто он генерируется нормально.

Однако тип содержимого в заголовке ответа - text/html; charset=utf-8, который должен быть text/javascript.

В контроллере я называю это так:

render :update do |page|
    if @step.errors.empty?
        page.redirect_to how_to_path(@article.id)
    else
        page.replace_html 'add_step_form', :partial => 'how_to/add_step', :locals => {:step => @step, :altered => true}
    end
end

Кажется, что сгенерирован код window.location.href... и Element.update..., но он не выполняется из-за неправильного типа содержимого.

Есть ли что-то, что я могу делать неправильно, что может вызвать это? Мне нужно решение, которое сделает RJS с прототипом работы. JQuery, вероятно, будет использоваться в будущем, но сделать это изменение сейчас не вариант.

Обновление: Я попробовал несколько других способов написания кода, в том числе указав :content_type => "text/javascript" в render, обернув его в блок respond_to с format.js, и переписав его как файл js.erb, но все по-прежнему возвращаются с text/html в качестве типа содержимого в заголовке ответа.

обновление Я как-то понял, как получить ожидаемое поведение, добавив headers["Content-Type"] = "text/javascript; charset=utf-8" в контроллер до render, но на самом деле это не самый лучший способ сделать это, если мне нужно добавить это явно перед каждым экземпляром RJS. Я бы хотел более чистое решение, если бы кто-нибудь смог его найти.

обновление Оказывается, перед каждым запросом before_filter выполнялся тип содержимого text / html. Я удалил это и смог удалить весь добавленный код headers["Content-Type"]. Это работало в моей среде разработки, но не в нашей среде проверки тестирования. Оказалось, что у нас там были кэшированы старые ресурсы, поэтому проверка выполнялась с прототипом 1.6.1, а в моей локальной среде разработки была 1.7.0. Это заставило rails.js не скомпилироваться при проверке, поэтому все запросы имели Accepts: text/html вместо text/javascript. Очистка этого кэша загрузила более новую версию прототипа и устранила проблему.

1 Ответ

1 голос
/ 03 апреля 2012

Оказывается, у нас был before_filter, который запускался перед каждым запросом, для которого тип содержимого был text / html.Я удалил это, и это работало без хака ниже.

Но если вам нужен обходной путь, вот что я сделал ниже.

Единственное, что я выяснил, чтобы сделать эту работу, было добавитьheaders["Content-Type"] = "text/javascript; charset=utf-8" до render :update

headers["Content-Type"] = "text/javascript; charset=utf-8"
render :update do |page|
  if @step.errors.empty?
    page.redirect_to how_to_path(@article.id)
  else
    page.replace_html 'add_step_form', :partial => 'how_to/add_step', :locals => {:step => @step, :altered => true}
  end
end

К сожалению, мне пришлось добавлять его в каждом месте кода, где вызывается RJS render :update.

...