Недавно наша команда представила исходную проблему, в которой пользователю будет отображаться необработанный javascript при нажатии кнопки "Назад" браузера со страницы, на которой была какая-то рендеринг javascript (будь то Ajax, вкладки и т.д.). Чтобы воссоздать, мы выполнили следующие шаги:
- Посетите индекс приложений для пользователей.
- Нажмите кнопку на странице публикации задания управления.
- Нажмите вкладку (используя драгоценный камень besttabs)
- Нажмите кнопку "Назад" браузера.
Предыдущие шаги:
(function() {
$(".job_applications").html("<li class=\"job_posting_application\">\n
...
...
...
...
);
}).call(this);
В некоторых случаях с хитом или пропуском вам не нужно будет щелкнуть вкладку перед возвратом на предыдущую страницу, но она все равно будет отображать необработанный javascript. В конце дня кажется, что последний обработанный шаблон кэшируется, что является нормальным и ожидаемым в части браузера, но ведет к тому, что я считаю большей проблемой.
В Rails Guides говорится о разделе Макеты и рендеринг, в частности, о типе MIME шаблона:
По умолчанию Rails будет обрабатывать результаты операции рендеринга с типом text/html содержимого MIME (или application/json, если вы используете опцию: json или application/xml для опции: xml.).
На основе значений Rails по умолчанию ожидается, что наше действие индекса контроллера отобразит наш шаблон index.html.slim. Однако при выполнении не удаленного вызова этой страницы (например, при непосредственном переходе на страницу в браузере) при отмене журналов сервера мы замечаем, что на самом деле он отображает index.js.coffee. Ниже приведено действие нашего контроллера и обратите внимание, что мы явно не отвечаем на форматы html или js, так как мы, вероятно, должны рассмотреть вышележащие функции на этой странице:
def index
@company_id, @division_id, @job_posting_id = params[:company_id], params[:division_id], params[:job_posting_id]
# API requests are made here to instantiate @job_posting, et al.,
# but are not shown for brevity
authorize! :manage, @job_posting
@survey = @job_posting.survey
@job_applications = @job_posting.job_applications(sort_column, sort_direction)
end
Однако, учитывая эту настройку, index.html.slim должен отображаться на основе значений по умолчанию Rails. При добавлении блока respond_to кажется, что кэширование все еще действует, и контроллер может не беспокоиться о наличии блока respond_to:
def index
...
...
respond_to do |format|
format.html
format.js
end
end
Даже если явно и хотя вонючий, говоря каждому формату для отображения другого шаблона, кажется, что шаблон js.coffee имеет приоритет над шаблоном html.slim:
def index
...
...
respond_to do |format|
format.html { render template: "users/job_posting_applications/index" }
format.js { render template: "users/job_posting_applications/ajax" }
end
end
В приведенном выше случае, непосредственно переходя к странице в браузере (другими словами, не делая удаленный вызов Ajax), журнал сервера будет отображать ajax.js.coffee, даже если по умолчанию Rails является html, если не указано иное.
Все это, как говорится, вот некоторые другие выводы:
Started GET "/users/companies/1/divisions/18/job_postings/349421/applications" for 127.0.0.1 at 2012-10-03 19:55:26 -0400
Processing by Users::JobPostingApplicationsController#index as JSON
(вы можете ссылаться на весь запрос, указанный выше в этом пасти)
Почему он обрабатывается как JSON вне меня, учитывая, что мы не обслуживаем JSON по этому запросу и не имеем никаких спецификаций в маршрутизации для формата по умолчанию :json для этого маршрута.
Кроме того, при отладке значения request.format внутри этого действия он возвращает application/json.
Другой сценарий, который представлен, находится внутри другого контроллера (users/company_admin_metrics#index), который содержит только шаблон index.html.slim. При навигации по этой странице журнал сервера показывает, что он отображал users/company_admin_metrics/index.html.slim внутри layouts/users. Когда я создаю пустой шаблон js.coffee:
$ touch app/views/users/company_admin_metrics/index.js.coffee
и непосредственно перейдите к этой индексной странице, журнал сервера показывает, что он отобразил users/company_admin_metrics/index.js.coffee, что еще больше открывает потенциальную проблему, связанную с приоритетом препровождения шаблона.
Кто-нибудь сталкивался с подобной проблемой, которая может обеспечить потенциальное исправление для этого?
Наш стек
Ниже приводится список основных игроков в этот конкретный вопрос:
- Rails 3.2.6
- Coffee-Rails 3.2.1
- Bettertabs 1.2.6
Этот запрос зависит от запросов на наш API публикации объявлений через клиентский жемчуг, который анализирует JSON и возвращает объект Ruby, но они не связаны с этим конкретным приложением таким образом, что это конфликтует и заставляет это приложение иметь контент тип application/json для такого запроса, как описано выше.