提问人:Philip V 提问时间:12/13/2011 更新时间:12/13/2011 访问量:694
在 Pusher 事件的回调函数中呈现 rails 部分。
Rendering rails partials in the callback function of a Pusher event.
问:
我正在开发一个相当简单的 Rails 应用程序,人们可以在其中提出问题并投票。我想构建一些实时功能,并决定使用 Pusher 来做到这一点(主要是因为它似乎与在 heroku 上部署非常兼容)。
目前,当您添加新问题时,会执行以下 javascript 部分:
if $('.question').hasClass('no_current_questions_notice')
$('.no_current_questions_notice').fadeOut 400, ->
$(this).replaceWith('<%= escape_javascript(render 'questions/added_question', :question => @added_question) %>')
$('.last_question').hide().fadeIn 400
else
$('.last_question').removeClass('last_question')
$('#added_question').replaceWith('<%= escape_javascript(render 'questions/added_question', :question => @added_question) %>')
$('.last_question').hide().fadeIn 400
我希望我可以简单地在 Pusher 回调中重用我的部分,这样我就可以重新创建推送器事件的 AJAX 请求后发生的情况。以最简单的形式查看以下内容:
<script type='text/javascript'>
var pusher = new Pusher('<%= Pusher.key %>');
var channel = pusher.subscribe('course-<%= @course.id %>');
channel.bind('create_question', function(data) {
var @added_question = data;
$('#added_question').replaceWith('<%= escape_javascript(render 'questions/added_question', :question => @added_question) %>');
});
</script>
作为参考,这是我的部分:
<div class='question last_question'>
<div class='question_content'>
<%= question.content %>
</div>
<%= render 'upvotes/agree', :question => question %>
</div>
<div id='added_question'>
</div>
还行。因此,当我尝试加载页面时,我的这会抛出错误“undefined method 'content' for nil:NilClass”。这是有道理的,因为在出现“创建问题”事件之前,问题不会被定义。但是,我不明白为什么 Rails 试图在“create-question”事件之前呈现该部分。(顺便说一句,我检查了一下,没有部分,其他一切都可以正常工作,数据是从 Pusher 发送的)。
我发现的大多数其他推送器集成示例都具有相当繁重的客户端 javascript。由于我不是 javascript 向导,我希望我不必为了合并推送器而重做应用程序的前端。有没有办法让我的代码保持干燥并在 Pusher 回调中使用我的分部?
答:
好的,经过更多的研究,我想我现在已经找到了解决方案。这个要点帮助我通过 Pusher: https://gist.github.com/1154209 发送完全渲染的部分。
这种方法对我有用,因为它允许我重用我的部分并合并 Pusher。我选择了 Gist 中的选项 3,因为它允许您添加更多数据以在将来相对容易地发送。
评论