2011-12-12 1 views
0

저는 사람들이 질문하고 upvote 질문을 할 수있는 매우 간단한 레일 애플 리케이션을 일하고 있습니다. 필자는 실시간 기능을 일부 구축하고 Pusher와 함께하기로 결정했습니다 (주로 heroku를 배포하는 것과 매우 호환되기 때문에). 당신이 새로운 질문을 추가 할 때Pusher 이벤트의 콜백 함수에서 레일을 부분적으로 렌더링합니다.

은 현재 자바 스크립트의 다음 비트가 실행됩니다 :

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 

나는 단순히 그래서 내가 AJAX 한 후 무엇을 재현 할 수있는 푸셔 콜백 내 부분 재사용 할 수 있다고 기대했다 푸셔 이벤트를 요청하십시오. 가장 간단한 형태로 아래를 참조

<div class='question last_question'> 
    <div class='question_content'> 
     <%= question.content %> 
    </div> 
    <%= render 'upvotes/agree', :question => question %> 
</div> 
<div id='added_question'> 
</div> 

확인 :

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

및 참조

이 내 부분입니다. 그래서이 내 페이지를로드하려고 할 때 'nil : NilClass'에 대한 '정의되지 않은 메서드`content'오류가 발생합니다. 이것은 'create-question'이벤트가있을 때까지 질문이 정의되지 않기 때문에 의미가 있습니다. 그러나 Rails가 'create-question'이벤트 전에 그 부분을 렌더링하려고하는 이유를 알지 못합니다. (BTW 내가 확인하고 부분없이, 다른 모든 작품과 데이터가 푸셔에서 보낸 가져옵니다).

다른 통합 사례 중 대부분은 클라이언트 쪽 자바 스크립트가 상당히 많았습니다. 내가 자바 스크립트 마법사가 아니므로, 푸시를 통합하기 위해 앱의 프런트 엔드를 다시 할 필요가 없기를 바랬습니다. 내 코드 DRY를 유지하고 Pusher 콜백에서 내 부분을 사용하는 방법이 있습니까?

답변

0

몇 가지 조사를 마친 후에 지금 해결책을 찾은 것 같습니다. 이 요지로 푸시 버튼을 통해 완전히 렌더링 된 부분을 보낼 수있었습니다 : https://gist.github.com/1154209.

이 방법을 사용하면 일부분을 재사용하고 푸셔를 통합 할 수 있으므로이 방법을 사용할 수 있습니다. 나는 당신이 미래에 비교적 쉽게 보내질 더 많은 데이터를 추가 할 수 있기 때문에 Gist에서 옵션 3으로 갔다.

+0

이 코드는 Rails 4에서 작동하지 않는 것 같습니다. 업데이트 된 코드가 있습니까? – fatfrog