问题描述
|
我正在使用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(在in1ѭ中):
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回调中编写什么以触发上述代码执行?
解决方法
您并不是在这里真正比较苹果。
您正在将XHR请求中呈现给'4'的模板与POST到
things/create
的@thing
对象的属性进行比较。
您需要在网络浏览器中处理从Pusher返回的“ 7”对象,并相应地修改DOM。
或者,一个更简单的解决方案可能是让您的控制器将格式化的HTML发送给Pusher而不是对象属性。然后,您的JavaScript代码可以只插入格式化的HTML,而不是尝试解析thing
对象并手动修改DOM。
回应@ user94154的评论:
免责声明:在您提出问题之前,我从未听说过Pusher。
b / c确实会带来挑战,通常您的HTML在视图中被格式化,但是您必须从控制器将数据发送到Pusher。我可以想到几种方法:
如果它不是太多的HTML标记,则可能要打破“不要重复自己”规则,并在控制器中重复该HTML标记,然后将其发送给Pusher
如果标记很多,我会将视图生成代码抽象给助手。您也可以从控制器中调用帮助程序。
在客户端,您应该有一个空的div(或某些DOM元素),它可以容纳Pusher中的HTML。并执行以下操作:
myChannel.bind(\'thing-create\',function(thing) {
$(\"div#thing_holder\").html(thing.html);
});
, http://blog.new-bamboo.co.uk/2010/5/12/integrating-pusher-into-a-complex-app-in-one-day
我有点头疼,但我认为这可能会使您步入正轨。
, pjax可能就是您想要的。自述文件中包括如何在Rails中开始使用它。
, 我了解,这是您的操作方法...
尝试在此处编写代码,但代码缩进等不适用于较长的内容...
http://jbeas.com/ruby-on-rails/rails-3-pusher-app-and-unobtrusive-js/