1

Rails を使って数年になりますが、AJAX と Javascript を試すのはこれが初めてです。さまざまな Web サイトを読むのに膨大な時間を費やし、何がどこにあり、何をすべきかを理解しようとしました。

「ストーリー」テーブルの「ターン」フィールドが変更されるたびに、Rails 4 アプリで edit.html.erb の「refreshme」div を更新しようとしています。そこで、story.js に setInterval() 関数を書き、@story.turn と refresh をチェックしました。10 秒ごとに更新するようにできますが、コードで story.turn の値を 10 秒ごとにチェックし、値が変更された場合にのみ更新するようにしたいだけです。

routes.rb (そうですか?)

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

refresh.html.erb (ビュー/ストーリー内 - ここに何があるのか​​わかりません)

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

edit.html.erb (ビュー/ストーリー) - show.html.erb はこの div にうまく更新されます

<div class="refreshme" data-story-id="<%=@story.id %>" data-story-turn="<%=@story.turn %>" >
  <%= render 'shared/micropost_form' %>
</div>

ストーリー.js

$(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); 
});  

stories_controller.rb

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

story.js では、GET 関数は実行されますが、POST 関数は実行されません。何を「POST」すればよいのかわかりません (データベースから値を「取得」していると思っていましたが、そうではないと思います)。

POST は、ストーリー テーブルから @story.turn を取得するために必要な AJAX 関数だと思いますが、何かを行う方法がわかりません。リフレッシュするには GET も必要ですか? 私はこのコードを何週間も考え続けてきました。どんな助けでも大歓迎です。

4

1 に答える 1