Вы можете обнаружить это, но это не красиво.
Во-первых, вам нужен новый контроллер с действием, которое обновляет время ожидания в сеансе:
class JavascriptController < ApplicationController
def confirm
session[:javascript_updated] = Time.now
end
end
Затем вам нужно включить действие javascript во все ваши страницы, чтобы это действие контроллера вызывалось при каждой загрузке страницы. Самый простой способ - включить его в файл «javascript-verify.js», включенный в ваш макет (в этом конкретном примере я использовал Ajax.Request Prototype, поэтому его также необходимо включить в javascripts):
function confirmJavascript()
{
// Assuming you are using Prototype
new Ajax.Request('/JavascriptController/confirm');
}
myTimeoutFunction();
setInterval(myTimeoutFunction, 10000); // invoke each 10 seconds
Это вызовет действие подтверждения во всех ваших просмотрах страницы. Наконец, вы должны контролировать, сколько времени прошло с момента вашего последнего подтверждения в контроллере приложения.
class ApplicationController < ActionController::Base
JAVASCRIPT_TIME_LIMIT = 10.seconds
before_filter :prepare_javascript_test
private
def prepare_javascript_test
if (session[:javascript_updated].blank? or
Time.now - session[:javascript_updated] > ApplicationController::JAVASCRIPT_TIME_LIMIT)
@javascript_active = true
else
@javascript_active = false
end
end
end
Теперь у вас будет переменная с именем @javascript_active
во всех ваших контроллерах.
Он должен работать, даже когда пользователь активирует / деактивирует JavaScript с точностью до 10 секунд. Это может не работать, если загрузка некоторых из ваших страниц занимает более 10 страниц (то есть с большим количеством изображений). Увеличьте лимит времени в этом случае (на контроллере приложений и вашем javascript)
Отказ от ответственности: я не проверял этот код, некоторые ошибки могут быть скрыты - но это должно указать вам правильное направление.