Ruby on Rails和Jquery:尝试在提交后切换字符

在这里的第一篇文章,所以我道歉,如果有些事情是关闭的(我如何插入代码,如果我没有包括足够的,或者如果我的问题太模糊)。

我对RoR非常非常新,我开始构建一个tic tac toe游戏。 我已经将它构建为在命令行上工作,现在我正在努力使其基于Web。 我有一个可点击的电路板,弹出X和O图像。 这与下面的一个表格相关联(一旦我完成所有工作,我会看不见),它会记录哪个玩家点击了哪个位置。

目前,我遇到了在提交页面后尝试切换播放器的问题。 我正在使用jQuery进行点击。 点击时我将每个空格弹出为“X”,我无法弄清楚提交后如何将玩家改为“O”。 我应该通过jQuery还是Ruby来做到这一点? 而且,我该怎么做?

为了澄清,我意识到我的代码可能不是最干净的,但此刻我更担心function性,并且稍后会使它更具代表性。

jQuery的:

$(document).ready(function(){ $(".square").click(function(){ // Gather the position that was clicked var number = $(this).data("position"); // Locate the game form var form = $("form"); // Locate the input field corresponding to that position var input = $("input[data-position='" + number + "']"); // Set the value of that input field to "X" or "O" input.val("X"); // Submit the form form.submit(); }); }); 

ruby:

 def create @game = Game.new(game_params) @game.save redirect_to @game end def update @game = Game.find(params[:id]) @game.update(game_params) redirect_to @game end def show @game = Game.find(params[:id]) end private def game_params params.require(:game).permit(:player_1, :player_2, moves_attributes: [:player, :id]) end 

HTML表单:

   


HTML游戏板:

 
<td data-position="0" class="square ">

对于电路板上的9个方块中的每个方块都是一样的。

链接到下一个阻止程序: jQuery .click函数在没有字符串的情况下无法正常工作

你需要将当前的玩家状态保持在表单提交之间的某个位置。

有很多方法可以做到这一点。 一种方式(可能不是最好的方法)是将当前播放器存储在会话哈希中,并使用每个表单提交来设置它。 像(在game_controller.rb中)的东西:

 def switch_player session[:current_player] = session[:current_player] == 'X' ? 'O' : 'X' end 

在控制器中的表单提交操作结束时调用switch_player

然后只需将它添加到您的主板(现在是

标签,可能应该是div ),如:

 

> <%= move_form.label :position %>
<%= move_form.text_field :player, data: {position: move_form.object.position} %> <%= move_form.hidden_field :id %>

然后你可以用jQuery把它拉出来:

  $(document).ready(function(){ var currentPlayer = $(#board).data("current-player"); $(".square").click(function(){ // Gather the position that was clicked var number = $(this).data("position"); // Locate the game form var form = $("form"); // Locate the input field corresponding to that position var input = $("input[data-position='" + number + "']"); // Set the value of that input field to "X" or "O" input.val(currentPlayer); // Submit the form form.submit(); }); }); 

顺便说一句,它看起来像你使用Rails练习,利用CRUD,REST和表单更新等。 这对于更多数据密集型应用程序最有效,其中模型表示数据库中的某个表,并且您使用表单来操作模型,从而操作数据库。 我提出这个问题是因为一个tic-tac-toe游戏可能不是了解基本Railsfunction的最佳领域。 像todo列表之类的东西可能更合适。

如果我能给你一些更多未经提出的建议,我会建议使用像Sinatra这样的东西。 Tic-tac-toe并不真正需要数据库后端,而Sinatra将为您提供一些良好的路由,模板化,处理URL,而不需要Rails的开销。 你可以把它想象成Rails lite。 当你开始使用Rails时,你学到的很多东西都会转移。

看起来您对数据属性感到满意,您可以将页面中的下一个符号存储在逻辑某处,并在单击表单时找到它。

所以代替:

 input.val("X"); 

你会这样做:

 input.val($('#some-id').data('next-symbol')); 

看看你的代码,你似乎基本上相信浏览器每次都会为整个游戏发送正确的符号。 考虑将此更改为使表单仅提交所选方块的位置,并在您的Game类中拥有更多逻辑,以跟踪谁进行移动并相应地更新游戏世界。

我想你会发现这一切都变得简单了,奖励我不能通过改变底层DOM和提交游戏来欺骗我所有的9个方格都填充了X而没有你的O!