我有一个简单的连接房间代码,用于多人游戏。
下面的图片是用户首先需要输入名称然后加入房间的索引页面。
这里有两个人加入了房间。一个客户端是chrome,另一个客户端是firefox。我做到了这样就可以创建两个不同的会话。
两个客户点击连接后,双击连接,它们将被带到startgame页面,如下所示。下面的图像是成功的场景,因为它们都显示各自的ID。
大多数情况下,缺少一个ID。错误视图如下图所示。我想知道为什么一个用户缺少id,或者换句话说为什么没有为一个用户设置会话。我在下面列出了这个简单应用程序的所有代码。我一直坚持这个问题一段时间,所以我终于转向stackoverflow的某些方向。我非常感谢你的帮助!谢谢! 通常情况如下。一个客户端或用户缺少一个ID。
class HelloController < ApplicationController
def index
end
def userCount
render plain: User.count
end
def join
n = params[:name]
u = User.create(name: n)
session[:current_user_id] = u.id
render plain: User.count
end
def startGame
@my_id = session[:current_user_id]
end
end
视图文件如下:
索引页面(首页)
index.html.erb
<label> Status: </label>
<span id="status"> </span>
<br>
<br>
<input type="text" id="name"> </input>
<button id="join"> Join </button>
<br>
<button id="enterroom"> Enter Room </button>
<script>
var refreshId = setInterval(function() {
$.get( "/userCount", function( data ) {
$('#status').text(data);
});
}, 1000);
$( "#join" ).click(function() {
$.post( "/join", { name: $('#name').val() })
.done(function( data ) {
});
});
$( "#enterroom" ).click(function() {
window.location.replace("/startGame");
});
</script>
加入后的页面已完成
startGame.html.erb
<h1> Ok game has started... </h1>
<br>
<h1> My id is <%= @my_id %> </h1>
schema.rb
ActiveRecord::Schema.define(version: 20161211055722) do
create_table "users", force: :cascade do |t|
t.string "name"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
end
路线
Rails.application.routes.draw do
root 'hello#index'
get '/userCount' => 'hello#userCount'
post '/join' => 'hello#join'
get '/startGame' => 'hello#startGame'
end
更新
好的,如果我在index.html.erb中评论以下代码,那么每次都会为两个用户生成ID。所以,看起来罪魁祸首是这部分代码,但我很困惑,为什么会这样。索引文件中的以下代码负责每1秒更新一次用户总数。可能是当点击加入时,会准备一个帖子请求,但是这个来电会拦截那个电话还是无效?谢谢!
/*
var refreshId = setInterval(function() {
$.get( "/userCount", function( data ) {
$('#status').text(data);
});
}, 1000);
*/
UPDATE2:
好的,我已经验证会话是在join方法中设置的,但是在执行startGame方法之前,正在重置会话或会话[:current_user_id]。我想知道为什么会话在成功设置后的某个时刻被重置。谢谢!
UPDATE3:
class User < ApplicationRecord
end
答案 0 :(得分:0)
我最好的猜测是以下行是罪魁祸首:
u = User.create(name: n)
您没有测试该用户是否有效或是否已生成错误,只是将其分配给会话:
session[:current_user_id] = u.id
如果有错误,那么u.id
将为零,并解释为什么您在视图中看不到ID。
您实际上没有在问题中显示用户模型,但我怀疑您对名称进行了唯一验证,这就是未创建用户的原因。很容易找出是否是这种情况,只需将一些调试放入:
u = User.create(name: n)
puts u.valid?
puts u.errors.messages
session[:current_user_id] = u.id
要解决此问题,您应该删除约束/验证,或者您应该测试错误并在控制器中正确处理它。
答案 1 :(得分:0)
我制作了你的应用程序的克隆,它运行得非常好。即使没有名称,记录也会正确保存。
我认为问题在于您正在测试代码的c9云平台。在运行localhost的本地计算机上,它可以正常工作。