Javascript 将Post请求发送回Sinatra Routes

Javascript 将Post请求发送回Sinatra Routes,javascript,ruby,ajax,sinatra,Javascript,Ruby,Ajax,Sinatra,我有一个基本的Sinatra/AJAX应用程序,它使两个图像相互竞争。游戏有两个用户,他们都会在页面加载时被提示登录。该应用程序是在考虑MVC框架的情况下建立的 我正在尝试实现一个数据库来存储比赛结果。我的数据库有三个表:games、players和player\u games(因为一个游戏可以有多个玩家,一个玩家可以玩很多游戏) 在控制器中,我有三条主要路线 登录后创建两个玩家的POST路线: post '/' do @game = Game.create(player_1: params

我有一个基本的Sinatra/AJAX应用程序,它使两个图像相互竞争。游戏有两个用户,他们都会在页面加载时被提示登录。该应用程序是在考虑MVC框架的情况下建立的

我正在尝试实现一个数据库来存储比赛结果。我的数据库有三个表:games、players和player\u games(因为一个游戏可以有多个玩家,一个玩家可以玩很多游戏)

在控制器中,我有三条主要路线

登录后创建两个玩家的POST路线:

post '/' do
  @game = Game.create(player_1: params[:player1], player_2: params[:player2])
  return (@game).to_json
end
获取“/game/:id”路径,加载统计数据erb(仅说明获胜的玩家以及玩游戏所花费的总时间):

以及POST“/stats”路径,它保存游戏和统计信息,并重定向回上面的GET请求:

post '/stats' do
  game = Game.find(params[:game_id])
  game.winner = params[:winner]
  game.play_time = params[:time]
  game.save!
  redirect '/game/' + params[:game_id]
end
在JavaScript文件中,当游戏结束时,我使用jQuery的
$.post
方法将统计数据发送到post'/stats'路径。这将保存统计信息,但不会将游戏重定向到GET'/game/:id'路径。它将完全命中代码的
@game=game.find(params[:id])
部分,如果我这样设置post路由,它甚至会打印“hello world”,但不会重定向到GET'/game/:id'路由:

get '/game/:id' do
  @game = Game.find(params[:id])
  erb :stats
  puts "hello world"
end

`D, [2014-04-29T19:48:51.723270 #3242] DEBUG -- :    (0.2ms)  BEGIN
D, [2014-04-29T19:48:51.729138 #3242] DEBUG -- :    (0.6ms)  UPDATE "games" SET "winner" = 'tim', "play_time" = 3, "updated_at" = '2014-04-29 19:48:51.724453' WHERE "games"."id" = 10
D, [2014-04-29T19:48:51.732144 #3242] DEBUG -- :    (2.6ms)  COMMIT
D, [2014-04-29T19:48:52.208625 #3245] DEBUG -- :   Game Load (1.4ms)  SELECT "games".* FROM "games" WHERE "games"."id" = $1 LIMIT 1  [["id", "10"]]
hello world`

因为
$.post
是异步的,所以它不会重定向页面。服务器代码正在执行,但实际上不会执行行
erb:stats

这有点混乱,但是在你的
$.post
之后,你可以做
window.location.href=“/game/”+任何特定的游戏id,这将重定向您

另外,请注意您的
has\u和\u属于\u many
联接表。它可能应该按字母顺序命名。从ActiveRecord文档:

除非将联接表显式指定为选项,否则将使用类名的词法顺序猜测联接表。因此,开发人员和项目之间的联接将给出默认联接表名“developers\u projects”,因为按字母顺序“D”在“P”之前

get '/game/:id' do
  @game = Game.find(params[:id])
  erb :stats
  puts "hello world"
end

`D, [2014-04-29T19:48:51.723270 #3242] DEBUG -- :    (0.2ms)  BEGIN
D, [2014-04-29T19:48:51.729138 #3242] DEBUG -- :    (0.6ms)  UPDATE "games" SET "winner" = 'tim', "play_time" = 3, "updated_at" = '2014-04-29 19:48:51.724453' WHERE "games"."id" = 10
D, [2014-04-29T19:48:51.732144 #3242] DEBUG -- :    (2.6ms)  COMMIT
D, [2014-04-29T19:48:52.208625 #3245] DEBUG -- :   Game Load (1.4ms)  SELECT "games".* FROM "games" WHERE "games"."id" = $1 LIMIT 1  [["id", "10"]]
hello world`