我已经尝试阅读有关该主题的大量文章和帖子,但我仍然感到困惑,无法弄清楚我需要做什么。有人可以准确解释我需要做什么吗?
我有一个 Rails 服务器(3.2.11),它的模型Game
代表 Ra 游戏的当前状态。我games_controller
有show
显示游戏和doturn
处理某人动作的方法。游戏视图显示游戏的当前状态并包含每个可能移动的链接,这些链接会提交回doturn
操作。我的目标是通过 AJAX 让视图在设定的时间段后或单击其中一个链接时自动刷新。但尽我所能,我无法让任何一个工作。
我的视图当前在 /views/games 文件夹中设置如下。
_game.html.erb
实际渲染游戏show.html.erb
只需添加一个标题,然后渲染部分,_game。show.js.erb
应该刷新页面。我不太确定这是如何工作的
我还使用//= require
etc 行启用了 Jquery(默认情况下它们已经存在)
编辑:我在链接上使用了 AJAX,但我仍然不知道如何在一定时间后使其自动刷新。有任何想法吗?
显示.html.erb:
<h1>Game <%= @game._id %></h1>
<div id="test"><%= render @game %></div>
显示.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 />