2016-07-15 2 views
1

Я отправил очень плохой вопрос об этом раньше, поэтому я отправляю и делаю это MVCE.Rails 4/AJAX GET данные от контроллера

Я строю службу обмена сообщениями с Rails и AJAX. Пока я могу отправить сообщение через форму, оно будет обновляться в HTML DOM, метод AJAX POST отправит его на контроллер, а контроллер сохранит его в базе данных.

Теперь мне нужно добавить метод AJAX, который будет получать сообщение, которое было отправлено, чтобы другие пользователи (в других браузерах) могли его просмотреть.

В настоящее время, и это хакерский способ выполнения, в моем JS-коде я устанавливал тайм-аут, который вызывает функцию AJAX GET каждые полсекунды. Есть ли лучший способ сделать это - как в случае, когда контроллер сохраняет сообщение, может ли он вызвать функцию AJAX? Код AJAX выглядит следующим образом:

function retrieveMessages(){ 
    var message; 
    <%debugger%> 
    $.ajax({ 
    type:"GET", 
    url:"<%= messages_get_path %>", 
    dataType:"json", 
    data: { what_goes_here: "blah" }, //this is the part I do not understand -- see below 
    success:function(data){ 
     message = data; 
     console.log(data) 
    } 
    }); 

    setTimeout(retrieveMessages, 500); 
} 

$(document).ready(function(){ 
    //get messages 
    setTimeout(retrieveMessages, 500); 
... more irrelevant 

линия data: { what_goes_here: "blah" } не имеет смысл для меня. Каков синтаксис для того, чтобы контроллер отправил данные обратно в data:? Кроме того, с консоли я вижу, что what_goes_here передается в качестве параметра контроллеру - опять же это не имеет смысла для меня.

Мой маршрут выглядит следующим образом get 'messages/get', :to => 'messages#get' (это может быть неправильно?)

rake routes показывает

messages_get GET /messages/get(.:format)  messages#get 

И как сейчас, я не имею ничего в моем контроллере, кроме respond_to, потому что в этот момент я просто пытаюсь вызвать контроллер. Каков синтаксис для отправки данных обратно в метод AJAX?

def get 
    debugger 
    respond_to do |format| 
    format.html 
    format.json {render json: @variable} //is this @variable being passed to the AJAX call? 
    end 
end 

UPDATE

Это имеет смысл для меня ... метод AJAX просто вызывает функцию def get. Затем функция def get находит сообщение в базе данных и сохраняет его в переменной экземпляра. Впоследствии я могу добавить код Javascript, который вставляет его в DOM. Однако у меня должно быть что-то неправильно в моей маршрутизации, потому что я получаю (в консоли) http://localhost:3000/messages/get 404 (Not Found)

+0

Вы хотите сказать, что другие пользователи с другими браузерами должны учесть это сообщение сразу после его отправки? –

+0

@NicNilov правильно, есть ли совершенно другой способ сделать это? –

+0

'data: {what_goes_here:" blah "}' предназначен для предоставления дополнительных параметров с запросом, как вы заметили сами. Поскольку вам не нужны дополнительные параметры для обновления сообщений, вы можете просто удалить эту строку. –

ответ

1

Что вы делаете, как вы подозреваете, неэффективно. Чем больше пользователей подключено к сети, тем больше будет загружаться из этих запросов на обновление, большинство из которых, вероятно, не возвращают никаких новых данных.

Вам следует рассмотреть более активный способ уведомления браузеров об изменениях на сервере. Один из вариантов - использовать ActionCable.

Смежные вопросы