Сочетание ненавязчивого JavaScript с Pusher - PullRequest
3 голосов
/ 28 мая 2011

Я использую Pusher для добавления обновлений страниц в реальном времени в мое приложение Rails.

Вот краткий обзор того, как работает Pusher (а позже я покажу вам, что яхотелось бы это сделать):

Контроллер:

class ThingsController < ApplicationController
  def create
    @thing = Thing.new(params[:thing])

    if @thing.save
      Pusher['things'].trigger('thing-create', @thing.attributes)
    end
  end
end

Javascript (в <head>...</head>):

var pusher = new Pusher('API_KEY');
var myChannel = pusher.subscribe('MY_CHANNEL');
myChannel.bind('thing-create', function(thing) {
  alert('A thing was created: ' + thing.name); // I want to replace this line
});

Я хочу заменить закомментированную строку наajax-запрос для запуска ненавязчивого JavaScript.Предположим, у меня есть файл app / views / things / index.js.erb:

$("things").update("<%= escape_javascript(render(@things))%>");  

Что я должен написать в обратном вызове myChannel.bind для запуска вышеуказанного кода?

Ответы [ 4 ]

1 голос
/ 13 июня 2011

Вы действительно не сравниваете яблоки с яблоками здесь.

Вы сравниваете шаблон, представленный в запросе XHR, с things/index с атрибутами объекта @thing от POST до things/create.

Вам необходимо обработать объект thing, который возвращается из Pusher в веб-браузере, и соответствующим образом изменить DOM.

Или, возможно, более простым решением было бы, если бы ваш контроллер отправлял форматированный HTML в Pusher вместо атрибутов объекта. Тогда ваш javascript-код может просто вставить отформатированный HTML-код, а не пытаться проанализировать объект thing и изменить DOM вручную.


Ответ на комментарий @ user94154:

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я никогда не слышал о Pusher, пока ваш вопрос.

Это создает проблему, т.к. ваш HTML обычно форматируется в представлении, но вы должны отправлять данные в Pusher с контроллера. Я могу придумать несколько способов сделать это:

  1. Если разметка HTML невелика, вы можете нарушить правило «Не повторять себя», повторить разметку HTML в своем контроллере и отправить ее в Pusher
  2. Если разметки много, я бы абстрагировал свой код генерации представления помощникам. Вы также можете вызвать помощника с вашего контроллера.

На стороне клиента у вас должен быть пустой div (или некоторый элемент DOM), который может содержать HTML-код из Pusher. И сделайте что-то вроде этого:

myChannel.bind('thing-create', function(thing) {
  $("div#thing_holder").html(thing.html);
});
0 голосов
/ 13 сентября 2011

Я понимаю, вот как ты это делаешь ...

Пытался написать здесь, но отступ для кода и т. Д. Не подходит для более длинных вещей ...

http://jbeas.com/ruby-on-rails/rails-3-pusher-app-and-unobtrusive-js/

0 голосов
/ 13 июня 2011

pjax может быть то, что вы ищете.В README включено, как начать работу с ним в Rails.

0 голосов
/ 28 мая 2011

http://blog.new -bamboo.co.uk / 2010/5/12 / интеграция "толкатель в сложное приложение в один день"

Немногочерез мою голову, но я думаю, что это может поставить вас на правильный путь.

...