发送请求回到Sinatra路由

时间:2014-04-29 23:50:20

标签: javascript ruby ajax sinatra

我有一个基本的Sinatra / AJAX应用程序,可以相互比较两个图像。该游戏有两个用户,提示他们在页面加载时登录。该应用程序在设置时考虑了MVC框架。

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

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

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

post '/' do
  @game = Game.create(player_1: params[:player1], player_2: params[:player2])
  return (@game).to_json
end

GET'/ game /:id'路线,它加载统计数据erb(只说胜利的玩家和玩游戏所花费的总时间):

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

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])部分,如果我设置了这样的邮政路线,甚至会打印“你好世界”,但是不会重定向到GET'/ game /:id'路线:< / 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`

1 个答案:

答案 0 :(得分:3)

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

这有点混乱,但在$.post之后,你可以window.location.href = "/game/" + whatever_the_specific_game_id_is; 会重定向你。

另外,请注意has_and_belongs_to_many联接表。它应该按字母顺序命名。来自ActiveRecord docs:

  

除非将连接表明确指定为选项,否则使用类名的词法顺序猜测它。因此,Developer和Project之间的连接将提供默认连接表名称“developers_projects”,因为“D”按字母顺序排在“P”之前。