在Pusher事件的回调函数中渲染rails部分。

时间:2011-12-12 17:28:19

标签: jquery ruby-on-rails-3.1 unobtrusive-javascript

我正在使用一个相当简单的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回调中重用我的部分,这样我就可以重新创建AJUS请求推送事件后发生的事情。请参阅以下最简单的形式:

<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>

确定。因此,当我尝试加载页面时,我的这个错误'未定义的方法'内容'为nil:NilClass'。这是有道理的,因为直到存在“创建问题”事件才会定义问题。但是,我不明白为什么Rails试图在'create-question'事件之前渲染那个部分。 (顺便说一句,我检查过,没有部分,其他一切正常,数据从Pusher发出)。

我发现的大多数其他推送器集成示例都有相当重的客户端javascript。因为我不是javascript向导,所以我希望我不必重做我的应用程序的前端只是为了合并推送器。有没有办法让我的代码干掉并在Pusher回调中使用我的部分?

1 个答案:

答案 0 :(得分:0)

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

这个方法适合我,因为它允许我重用我的部分并合并Pusher。我在Gist中选择了3,因为它可以让你在未来相对容易地添加更多数据。