1

私はすでにこのテーマに関する記事や投稿を数多く読んでみましたが、まだ当惑しており、何をする必要があるのか​​ わかりません. 誰かが私が何をする必要があるかを正確に説明できますか?

GameRa ゲームの現在の状態を表すモデルを備えた Rails サーバー (3.2.11) があります。Myには、ゲームを表示するためgames_controllerのメソッドと、誰かのアクションを処理するためのメソッドがあります。ゲーム ビューには、ゲームの現在の状態が表示され、可能な動きごとのリンクが含まれており、アクションに送信されます。私の目標は、AJAX を介して、設定された期間の後、またはリンクの 1 つがクリックされるたびにビューを自動的に更新することです。しかし、私ができる限り試してみてください。どちらも機能させることができません。showdoturndoturn

私のビューは現在、/views/games フォルダーで次のように設定されています。

  • _game.html.erb実際にゲームをレンダリングします
  • show.html.erbヘッダーを追加して、部分的な _game をレンダリングするだけです。
  • show.js.erbページを更新することになっています。これがどのように機能するのかよくわかりません

また、etc 行で Jquery を有効にしました//= require(それらはデフォルトで既に存在していました) 。

編集: リンクで AJAX が機能するようになりましたが、一定時間後に自動更新する方法がわかりません。何か案は?

show.html.erb:

<h1>Game <%= @game._id %></h1>
<div id="test"><%= render @game %></div>

show.js.erb:

$('#test').html('<%= escape_javascript (render @game) %>')

ゲームコントローラ

  # GET /games/1
  # GET /games/1.json
  def show
    @game = Game.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @game }
      format.js
    end
  end

  # POST /games
  def doturn
    error = Proc.new do |message|
      flash[:alert] = message
      return render :inline => "<%= flash[:alert] %>"
      #return redirect_to :back       #must return from method immediately
    end

    @game = Game.where(id: params[:id]).first
    if @game.nil?
      error.call "Game not found"
    end

    #all the game update logic here

    @game.save
    redirect_to :action => "show", :id => @game._id
  end

これが私の部分的なビューの簡略化されたバージョンです。レンダリングに関する多くの作業を省略しましたが、それでも重要な動作はすべて含まれています。最初にこのビューを機能させるように努めるべきだと考えています。それから、後でコードの残りの部分を追加することができます。

<% game.game_players.each_with_index do |player, i| %>
<table>
  <tr><td>Player <%= i+1 %></td></tr>
  <tr><td>Suns: </td><td><%= player.suns %></td></tr>
  <tr><td>Pharaohs: </td><td><%= player.pharaohs %></td></tr>
</table><p>

  <% 
  make_linkt = lambda do |text, kwargs|
    concat link_to text, {:remote => true, :method => "post", :action => "doturn", :id => game, :player => i}.merge(kwargs) # ** requires ruby 2
    concat raw "<br/>"
  end

    if i == game.turn
        if game.god_status == 0
            make_linkt.call("Invoke Ra", :type=>"invoke")
              if game.auction_track.size < 8
                make_linkt.call("Draw tile", :type=>"draw")
            end
        else
                make_linkt.call("Done", :type=>"god", :vals=>[], :endturn=>1)
        end
  end
  %> 

<% end %>
<br />
4

2 に答える 2

0

show.js ビューを要求する javascript setTimeout メソッドを実行できます。

ビュー (または、ゲームを表示する特定のページ用にのみレンダリングされた .js アセット) で:

<script type="text/javascript>
    function updateGame(data){
      $.ajax({
        type: "GET",
        url: "/games/whatever-your-path-is.js",
        dataType: "script"
      });
    }
    setTimeout(updateGame({gameId: '<%= @game.id %>'}, 5000)
</script>

updateGame のデータ変数は、たとえば適切な URL を「生成」するために ajax 呼び出しで使用できます。たとえば、url の行は次のようになります。

url: "/games/" + data.gameId + "/whatever.js"
于 2013-04-30T04:39:24.913 に答える