Я думаю, вы задаете неправильный вопрос
Turbolinks предназначается для того, когда вы переключение между видами - это помогает ограничить количество запросов к серверу:
Turbolinks делает следующие ссылки в вашем веб-приложении быстрее. Вместо того, чтобы позволить браузеру перекомпилировать JavaScript и CSS между каждым изменением страницы, он сохраняет текущий экземпляр страницы жив и заменяет только тело и титул в голове
опрос
Что вы действительно ищете "живой" функциональность:
- Ajax Опрос (как правило, с SSE в)
- WebSockets
Rails работает на структуру HTTP, то есть вы отправить запрос, он отвечает. Проблема заключается в том, что Rails не позволяет генерировать запрос со стороны сервера. Технологии, такие как ActionController::Live был создан, чтобы исправить это, но это отрывочный
Я бы рекомендовал использовать службу под названием Pusher
Это pub/sub tech, работает, давая вам в ваших JS в eventListener
, в основном «прослушивания» в любые обновления с вашего сервера. Вы можете публиковать обновления через Rails' Pusher gem:
#app/assets/javascripts/application.js.coffee
pusher = new Pusher("*************", cluster: 'eu')
channel = pusher.subscribe("private-user-#{gon.user}")
channel.bind "multi_destroy", (data) ->
# do your stuff here
#app/controllers/message.rb
def send_message
public_key = self.user.public_key
Pusher['private-user-' + public_key].trigger('message_sent', {
message: "Message Sent"
})
end
Это нехорошее решение, если вы поместите этот javascript внутри тела страницы. Когда turbolinks перезагружает содержимое тела, таймер не удаляется, но добавляется новый. В результате получается несколько таймеров (по одному для каждой перезагрузки), каждый триггерный клик и новый запрос. Запросы отменены в javascript, и только последний проходит, но на стороне сервера каждый запрос принимается и обрабатывается. – Montas
@Montas - это хороший момент, спасибо! Но вы правы, это ужасное решение, и не одно, которое я бы ввел в производство, с или без многократных перезагрузок :) –