2014-05-20 14 views
0

2 년 동안 Rails에서 작업 해 왔지만 AJAX 및 Javascript에서 처음 시도한 것입니다. & 무엇을 해야하는지 알아 내려고 노력하면서 엄청난 시간을 여러 웹 사이트를 읽는 데 보냈습니다.값이 변경되면 AJAX로 새로 고침하면 Rails 4를 사용하여 데이터베이스에서 한 값을 폴링하는 방법

'stories'테이블의 'turn'필드가 변경 될 때마다 레일스 4 응용 프로그램에서 edit.html.erb의 'refreshme'div를 새로 고치려고합니다. 그래서 story.js에서 @ story.turn을 확인하기 위해 setInterval() 함수를 작성했습니다 & 새로 고침. 나는 매 10 초마다 새로 고침을 얻을 수 있지만, 코드를 으로 변경하려면마다 10 초마다 story.turn의 값을 확인하십시오. 값이 변경되면 & 새로 고침 만하십시오.

routes.rb (이 맞나요?)

match '/stories/:id/refresh' => "stories#refresh", :as => :story_refresh, via: 'post' 

refresh.html.erb (보기/이야기 - 내가 여기에 속한 것을 단서가 없다)

<div class="pollme" data-story-id="<%[email protected] %>" data-story-turn="<%[email protected] %>" > 
    <%[email protected] %> // This gets changed based on what other users are editing 
</div> 

edit.html합니다. ERB (보기/이야기) -이

<div class="refreshme" data-story-id="<%[email protected] %>" data-story-turn="<%[email protected] %>" > 
    <%= render 'shared/micropost_form' %> 
</div> 

story.js를 div에로 show.html.erb 멋지게 새로 고쳐

,
$(document).on("page:change", function() { 
    var $turn; 
    $turn = $('.refreshme').data('story-turn'); 

    refreshStories = function(){ 

    $.ajax({  
     type: "POST", 
     data: { }, // I'm sure something important goes here to get @story.turn out of the stories table 
     url: "/stories/"+$('.refreshme').data('story-id')+"/refresh"  
    }).done(function(result) { 
      alert('done'); 
     $turn = ; // Not sure what data{} can return 
    }) 

    if ($('.refreshme').data('story-turn') != $turn) { 
     $.ajax({ 
     type: "GET", // helps show.html.erb get refreshed into refreshme div in edit.html.erb 
     url: "/stories/"+$('.refreshme').data('story-id') 
     }).done(function(result) { 
     var $sentence_requests = $('.refreshme'); 
     if ($sentence_requests.length > 0) { 
      $sentence_requests.html(result); 
      alert('UPDATED micropost requests ') ; 
     } else { 
     } 
     }) 
    } 
    }; 
    setInterval(refreshStories, 10000); 
}); 

story.js에서
def refresh 
    @story = Story.find(params[:id]) 
    respond_to do |format| 
    format.json { } 
    format.html { } 
    end 
end 

def edit 
    @story = Story.find(params[:id]) 
    @micropost = @story.microposts.build 
    respond_to do |format| 
    format.json { } 
    format.html { } 
    end 
end 

에서, GET 기능 실행 stories_controller.rb 그러나 POST 기능하지 않는다. 나는 내가 'POST'(데이터베이스에서 가치를 얻고 있다고 생각했지만, 그렇지 않은 것)라고 생각하는지 확신 할 수 없다.

나는 POST가 story 테이블에서 @ story.turn을 얻는 데 필요한 AJAX 함수라고 생각하지만, 아무것도하지 못하게하는 방법을 알고있다. 새로 고침하려면 GET이 필요합니까? 나는이 코드를 몇 주 동안 kludging했는데, 이것은 지금까지 알아야 할 것 같다. 어떤 도움이라도 대단히 감사하겠습니다.

답변

0

공개 github 저장소에이 코드를 넣으면 사람들이 컨텍스트 내에서 코드를 볼 수 있으며 코드 작성 방법을 보여주는 끌어 오기 요청을 보낼 수 있습니다.

+0

OK, 조, 여기 내 레포입니다. https://github.com/crowdpublishtv/sentenceZing RailsCast 229를 시도했기 때문에 조금 편집했는데, 그것이 내가 원하는 것을 실제로하지는 않습니다. 스토리 파트너가 자신의 스토리 마이크로 포스트를 입력 한 후 마이크로 포스트 텍스트 상자가 표시되도록 @ story.turn을 업데이트해야합니다. 구현을 보려면 http://sentenceZing.com을 참조하십시오. – CrowdPublishTV

+0

나는 훑어 보았지만, 프로젝트가 깨진 상태에있다 : rake db : 마이그레이션이 깨끗한 설치에서 실패한다 : –

+0

나는 훑어 보려고했으나 프로젝트가 깨진 상태에있다 : rake db : migrate fails on 새로 설치 : SQLite3 :: SQLException : 테이블이 없습니다 : 좋아하는 : ALTER TABLE "likes"ADD "user_id"정수를 입력하십시오. 더 많은 시간을 할애하지는 않겠지 만 내 질문은 : POST가 필요 하신가요? 필요한 것은 끝점에 도달하는 AJAX GET뿐입니다. 해당 끝점에서 DB 쿼리를 수행하고 "이 값이 변경되지 않았습니다"라는 충분한 정보를 제공하는 응답을 반환하십시오. 그런 다음 그 응답에 따라 행동하십시오. POST가 필요하지 않으므로 서버의 데이터를 변경해야합니다. –