在 Pusher 事件的回调函数中呈现 rails 部分。

Rendering rails partials in the callback function of a Pusher event.

提问人:Philip V 提问时间:12/13/2011 更新时间:12/13/2011 访问量:694

问:

我正在开发一个相当简单的 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 回调中使用我的分部?

jquery ruby-on-rails-3.1 不显眼的javascript

评论


答:

0赞 Philip V 12/13/2011 #1

好的,经过更多的研究,我想我现在已经找到了解决方案。这个要点帮助我通过 Pusher: https://gist.github.com/1154209 发送完全渲染的部分。

这种方法对我有用,因为它允许我重用我的部分并合并 Pusher。我选择了 Gist 中的选项 3,因为它允许您添加更多数据以在将来相对容易地发送。

评论

0赞 fatfrog 3/29/2015
这似乎在 Rails 4 中不起作用 - 你有更新的代码吗?