为什么有时没有设置会话?

时间:2016-12-11 09:27:00

标签: ruby-on-rails session

我有一个简单的连接房间代码,用于多人游戏。

下面的图片是用户首先需要输入名称然后加入房间的索引页面。

enter image description here

这里有两个人加入了房间。一个客户端是chrome,另一个客户端是firefox。我做到了这样就可以创建两个不同的会话。

enter image description here

两个客户点击连接后,双击连接,它们将被带到startgame页面,如下所示。下面的图像是成功的场景,因为它们都显示各自的ID。

enter image description here

大多数情况下,缺少一个ID。错误视图如下图所示。我想知道为什么一个用户缺少id,或者换句话说为什么没有为一个用户设置会话。我在下面列出了这个简单应用程序的所有代码。我一直坚持这个问题一段时间,所以我终于转向stackoverflow的某些方向。我非常感谢你的帮助!谢谢! 通常情况如下。一个客户端或用户缺少一个ID。

enter image description here 代码如下:

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

2 个答案:

答案 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的本地计算机上,它可以正常工作。