2015-09-04 6 views
2

Rails 3, JRubyAjax Частичное Refresh опросом в Rails 3, JQuery

Недавно я принял участие в быстром ходе аварии в JQuery, который включал немного частичного рендеринга AJAX. Это заставило меня подумать, могу ли я использовать это для опроса сервера Rails, используя setInterval(), каждые x секунд, чтобы постоянно обновлять определенную часть моей страницы?

Проблема, с которой я сталкиваюсь, заключается в том, как я мог бы использовать метод $.get(), чтобы захватить URL-адрес частичного и перезагрузить его с помощью load(). Здесь начинается путаница - с использованием Rails 3, у меня есть частичное название «_microposts», отображаемое внутри div с «id =« gf »» (gf означает глобальный фид). Это происходит на моей домашней странице Rails, поэтому в этом случае URL-адрес будет «// localhost: 8080/home», а не URL-адрес частичного.

Вот мой начальный JavaScript/JQuery

<script> 
    $(document).ready(function() {  
     setInterval(function (e) { 
      var url = $.get("<%= escape_javascript render :partial => 
       'microposts/micropost', :locals => {:microposts => @microposts }%>"); 

      $('#gf').html('loading...').load(url);   
     },10000); 
    }); 
</script> 

Это выглядит не так, и до сих пор, просто гасит свои _microposts частичных через 10 секунд (так setInterval работают, и это, безусловно, обновляя правильную область, просто с пустым пространством)

Edit: Думая о моей проблеме, я понял, что это похоже на обновление частично из события, например, нажатие кнопки или что-то. Единственное реальное различие - это «событие», которое должно вызвать эту функцию setInterval(). Итак, мой пересмотренный JQuery код выглядит следующим образом:

<script> 
    $(document).ready(function() { 
     setInterval(function (e) { 
      $('#gf').html("<%= escape_javascript render :partial => 
       'microposts/micropost', :locals => {:microposts => @microposts } %>")}, 
      10000); 
    }); 
</script> 

К сожалению сейчас, ничего не кажется, что происходит с точки зрения пользователя, а сервер, показывающий Ajax запрос каждые 10 секунд.

Так почему я не могу опросить обновления с помощью ajax и применить изменения к моим частицам _microposts? Есть $.get правильная функция для использования в этом случае? Каким будет URL-адрес метода load() при попытке перезагрузить частичный?

Спасибо,

ответ

2

Надеюсь, это поможет любому, кто хочет обновить частично с использованием ajax- особенно если вы новичок следующие учебники Майкла Hartl, чтобы узнать Ruby On Rails. Вот как мне удалось решить мою проблему.

Во-первых, я создал отдельный файл .js.erb в папке вида micropost, называемой «polling.js.erb», которая будет обновлять частичный поток.

$('#gf').html("<%= escape_javascript render :partial => 
          'microposts/micropost', :locals => {:microposts => @mps} %>"); 

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

def polling 
    @mps = Micropost.all #add some paginate code if you wish 
    @micropost = current_user.microposts.build(params[:micropost])     
end 

Затем я пересмотрел свой код яваскрипта, как я хотел назвать метод опроса каждые 5 секунд, загружая информацию, относящуюся к CURRENT_USER моего веб-приложение.

$(document).ready(function() { 
    setInterval(function() { 
      $.ajax('microposts/<%= current_user.id %>/polling'); 
    } , 5000);   
}); 

Наконец, я обновил свой routes.rb файл, чтобы позволить веб-браузер, чтобы назвать мой метод опроса, с использованием запроса GET, не вызывая ошибки маршрутизации.Я использую блок member do, потому что запрос передает идентификатор current_user по запросу.

resources :microposts do 
    member do 
     post :polling 
    end 
end