2014-04-29 28 views
0

我有一個基本的Sinatra/AJAX應用程序,可以將兩個圖像相互對抗。遊戲中有兩個用戶,他們都被提示在頁面加載時登錄。該應用程序設置了一個MVC框架。發送郵件請求返回Sinatra路線

我想實現一個數據庫,將存儲比賽的結果。我的數據庫有三個表格:遊戲,玩家和玩家遊戲(因爲遊戲可以有多個玩家,玩家可以玩很多遊戲)。

在控制器中,我有三條主要路線。

的POST路線,創造登錄後雙方球員:

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

的GET「/遊戲/:身份證」的路線,它加載統計ERB(只是說誰贏得球員和總時間帶着玩遊戲):

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

和後「/統計」路線,從而節省了遊戲和統計,並重定向到上面的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])部分代碼,並且甚至會打印出「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` 

回答

1

由於$.post是異步的,它不會重定向頁面。服務器代碼正在執行,但它不會實際執行行erb :stats

這是一種凌亂,但在你的$.post之後,你可以做window.location.href = "/game/" + whatever_the_specific_game_id_is;會重定向你。

另外,請注意您的has_and_belongs_to_many連接表。它應該可以按字母順序命名。來自ActiveRecord文檔:

除非將連接表明確指定爲選項,否則會使用類名稱的詞法順序來猜測。因此,開發人員和項目之間的連接將給出默認連接表名稱「developers_projects」,因爲「D」按字母順序排在「P」之前。