Ruby on Rails控制器重定向不会发生在WEBGL运行中

met*_*key 6 iframe ruby-on-rails unity-game-engine unity-webgl

我有一个嵌入rails静态页面的WEBGL播放器,如'demo_path',如下所示:

<% provide(:title, 'Sign up') %>
<h1>Sign up</h1>

<div class="row">
<div class="col-md-6 col-md-offset-3">
<%= form_for(@user, url: signup_path) do |f| %>
  <%= render 'shared/error_messages' %>

  <%= link_to "mindpass", demo_path, class: "btn btn-lg btn-primary" 
%>

  <%= f.submit "Create my account", class: "btn btn-primary" %>
<% end %>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)

当用户单击该按钮时,它会加载webgl模板:

<!DOCTYPE html>
<html lang="en-us">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="Content-Type" content="text/html; charset=utf- 
8">
<title>Unity WebGL Player | MindPass_DEMO</title>
<script src="Build/UnityLoader.js"></script>
<script>
  var gameInstance = UnityLoader.instantiate("gameContainer", 
"/assets/Build/MindPass_WEBGL_RY2.json");
</script>
</head>
<body>
<div id="gameContainer" style="width: 90%; height: 90%; position: 
absolute; margin: auto;"></div>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

这成功加载并实际启动用户控制器以保存新用户并启动'redirect_to @users',如以下users_controller代码所示:

def create
    puts "create runs"
    #puts params.inspect
    @user = User.new(user_params)
    if @user.save

      puts "user save runs"
      log_in @user
      puts "second welcome to your vault(users_cont)"
      flash[:success] = "Welcome to your vault!"
      redirect_to @user
    else
      puts "render new runs"
      render 'new'
    end
  end
Run Code Online (Sandbox Code Playgroud)

问题是重定向实际上并没有发生.以下是尝试的日志,包括重定向:

2018-11-07T05:04:21.897020 + 00:00 app [web.1]:我,

[2018-11-07T05:04:21.896891#20] INFO - :[c5de6e8e-58e2-4177-ae17-e1f58fbb65ee]在2018-11-07 05:04:21 +开始发布"/ signup"76.120.71.73 0000 2018-11-07T05:04:21.898131 + 00:00 app [web.1]:我,

[2018-11-07T05:04:21.898049#20]信息 - :[c5de6e8e-58e2-4177-ae17-e1f58fbb65ee]由UsersController处理#create as / 2018-11-07T05:04:21.901161 + 00:00 app [ web.1]:I,[2018-11-07T05:04:21.901036#20] INFO - :[c5de6e8e-58e2-4177-ae17-e1f58fbb65ee]参数:{"EMAIL"=>"jakeywtf34@gmail.com" ,"密码"=>"[过滤]"}

2018-11-07T05:04:21.902007 + 00:00 app [web.1]:W,[2018-11-07T05:04:21.901922#20]警告 - :[c5de6e8e-58e2-4177-ae17-e1f58fbb65ee]无法验证CSRF令牌的真实性.2018-11-07T05:04:21.907902 + 00:00 app [web.1]:创建运行

2018-11-07T05:04:21.907965 + 00:00 app [web.1]:user_params运行

2018-11-07T05:04:21.908031 + 00:00 app [web.1]:除非user_params中的状态2018-11-07T05:04:22.141541 + 00:00 app [web.1]:D,

[2018-11-07T05:04:22.141393#20]调查 - :[c5de6e8e-58e2-4177-ae17-e1f58fbb65ee] [1m [35m(5.0ms)[0m [1m [35mBEGIN [0m 2018-11-07T05: 04:22.145580 + 00:00 app [web.1]:D,[2018-11-07T05:04:22.145463#20]调试 - :[c5de6e8e-58e2-4177-ae17-e1f58fbb65ee] [1m [36mUser Exists( 2.5ms)[0m [1m [34mSELECT 1 AS one FROM"users"WHERE LOWER("users"."email")= LOWER($ 1)LIMIT $ 2 [0m [["email","jakeywtf34@gmail.com"] ,["LIMIT",1]]

2018-11-07T05:04:22.149368 + 00:00 app [web.1]:D,

[2018-11-07T05:04:22.149270#20]调查 - :[c5de6e8e-58e2-4177-ae17-e1f58fbb65ee] [1m [35mSQL(2.1ms)[0m [1m [32mINSERT INTO"users"("email") ,"created_at","updated_at","password_digest")VALUES($ 1,$ 2,$ 3,$ 4)返回"id"[0m [["email","jakeywtf34@gmail.com"],["created_at"," 2018-11-07 05:04:22.146010"],["updated_at","2018-11-07 05:04:22.146010"],["password_digest","$ 2a $ 10 $ g.RhGJDfl23/zPDeyXEI.OcnsfKfYH3jE4GB7py6/ktMJ3N6y73OW"]

2018-11-07T05:04:22.153387 + 00:00 app [web.1]:D,

[2018-11-07T05:04:22.153287#20]调查 - :[c5de6e8e-58e2-4177-ae17-e1f58fbb65ee] [1m [35m(3.5ms)[0m [1m] [35mCOMMIT [0m 2018-11-07T05: 04:22.153528 + 00:00 app [web.1]:用户保存运行2018-11-07T05:04:22.153618 + 00:00 app [web.1]:第二次欢迎您的保险库(users_cont)2018-11-07T05 :04:22.154318 + 00:00 app [web.1]:我,

[2018-11-07T05:04:22.154239#20]信息 - :[c5de6e8e-58e2-4177-ae17-e1f58fbb65ee]重定向至 https://immense-castle-53592.herokuapp.com/users/126

2018-11-07T05:04:22.154585 + 00:00 app [web.1]:我,

[2018-11-07T05:04:22.154507#20]信息 - :[c5de6e8e-58e2-4177-ae17-e1f58fbb65ee]完成302发现于253ms(ActiveRecord:13.0ms)2018-11-07T05:04:22.221827 + 00 :00 app [web.1]:我,

[2018-11-07T05:04:22.221705#6] INFO - :[972376e5-2f11-4985-91fe-53b071181359]在2018-11-07 05:04开始获取76.120.71.73的GET"/ users/126": 22 +0000 2018-11-07T05:04:22.229274 + 00:00 app [web.1]:我,

[2018-11-07T05:04:22.229112#6]信息 - :[972376e5-2f11-4985-91fe-53b071181359]由UsersController处理#show as / 2018-11-07T05:04:22.230258 + 00:00 app [ web.1]:我,

[2018-11-07T05:04:22.230174#6] INFO - :[972376e5-2f11-4985-91fe-53b071181359]参数:{"id"=>"126"}

2018-11-07T05:04:22.156370 + 00:00 heroku [router]:at = info method = POST path ="/ signup"host = immense-castle-53592.herokuapp.com request_id = c5de6e8e-58e2-4177-ae17 -e1f58fbb65ee fwd ="76.120.71.73"dyno = web.1 connect = 1ms service = 264ms status = 302 bytes = 559 protocol = https 2018-11-07T05:04:22.419460 + 00:00 app [web.1]:D ,

[2018-11-07T05:04:22.419270#6]调试 - :[972376e5-2f11-4985-91fe-53b071181359] [1m [36m用户负荷(6.4ms)[0m [1m [34mSELECT"用户".*FROM"用户"WHERE"用户"."id"= $ 1 LIMIT $ 2 [0m [["id",126],["LIMIT",1]]

2018-11-07T05:04:22.469417 + 00:00 app [web.1]:我,

[2018-11-07T05:04:22.469246#6]信息 - :[972376e5-2f11-4985-91fe-53b071181359]在布局/应用程序中渲染users/show.html.erb 2018-11-07T05:04:22.470569+ 00:00 app [web.1]:我,

[2018-11-07T05:04:22.470487#6]信息 - :[972376e5-2f11-4985-91fe-53b071181359]在布局/应用程序(1.0ms)中呈现的users/show.html.erb 2018-11-07T05: 04:22.484847 + 00:00 app [web.1]:我,

[2018-11-07T05:04:22.484727#6]信息 - :[972376e5-2f11-4985-91fe-53b071181359]渲染布局/ _rails_default.html.erb(4.8ms)

2018-11-07T05:04:22.497488 + 00:00 app [web.1]:我,

[2018-11-07T05:04:22.497361#6]信息 - :[972376e5-2f11-4985-91fe-53b071181359]渲染布局/ _shim.html.erb(0.5ms)2018-11-07T05:04:22.526778+ 00:00 app [web.1]:我,

[2018-11-07T05:04:22.526644#6]信息 - :[972376e5-2f11-4985-91fe-53b071181359]渲染布局/ _header.html.erb(12.1ms)2018-11-07T05:04:22.540219+ 00:00 app [web.1]:我,

[2018-11-07T05:04:22.540092#6]信息 - :[972376e5-2f11-4985-91fe-53b071181359]渲染布局/ _footer.html.erb(1.0ms)2018-11-07T05:04:22.541427+ 00:00 app [web.1]:我,

[2018-11-07T05:04:22.541342#6]信息 - :[972376e5-2f11-4985-91fe-53b071181359]在311ms完成200 OK(浏览次数:83.8ms | ActiveRecord:103.3ms)

2018-11-07T05:04:22.544712​​ + 00:00 heroku [router]:at = info method = GET path ="/ users/126"host = immense-castle-53592.herokuapp.com request_id = 972376e5-2f11-4985 -91fe-53b071181359 fwd ="76.120.71.73"dyno = web.1 connect = 1ms service = 324ms status = 200 bytes = 2692 protocol = https

当我使用下面的普通表单输入执行此操作时,会发生相同的重定向日志,并且它实际上会转到用户页面:

  <%= f.label :email %>
  <%= f.email_field :email, class: 'form-control' %>

  <%= f.label :password %>
  <%= f.password_field :password, class: 'form-control' %>
Run Code Online (Sandbox Code Playgroud)

似乎WEBGL正在锁定这个东西并拒绝实际重定向页面,即使它应该发生.我错过了什么?

更新12-6-18:

我注意到当WEBGL启动重定向时(不成功)我在日志中得到了这个:用户控件处理#show as /.如果我从正常的html表单重定向(成功)我在日志中得到这个:由UsersController处理#show as HTML.这是日志中唯一的区别.

我测试了以下内容:

  1. 使用多个浏览器进行测试,看它是否特定于某些浏览器
  2. 通过将重定向网址更改为https://www.google.co.uk/进行测试,以查看重定向是否成功
  3. 添加了一个条件,以确保在继续使用脚本之前完成重定向
  4. 尝试通过LocalHost测试Heroku(仍然没有继续)可悲的是,这些测试都没有产生任何明显的结果.

适用于来自gameInstance的UnityWebRequest C#代码:

phase4 = true;
        Invoke ("QuitGame", 10f);
  }
      }

    private  IEnumerator  Connection ( string  name )
    {
    WWWForm  form  =  new WWWForm ();
    form . AddField ( "EMAIL" ,  _email );
    form . AddField ( "PASSWORD" ,  passwordUnityEncrypted );
    form . AddField ( "HOST_URL" ,  absoluteURL );
    form . AddField ( "SIGNUP_PATH" ,  _url_signup_route );
    form . AddField ( "LOGIN_PATH" ,  _url_login_route );

    if (absoluteURL == _url_signup){
    UnityWebRequest  request  =  UnityWebRequest . Post ( 
    _url_signup_route ,  form );
    yield  return  request . Send ();
    } else{
    UnityWebRequest  request  =  UnityWebRequest . Post ( 
    _url_login_route ,  form );
    yield  return  request . Send ();
    }
Run Code Online (Sandbox Code Playgroud)

Mat*_*att 4

我在这里做了一些假设,但我假设背后的 javascriptgameInstance正在提交 post 请求,如果是这种情况,那么我会检查它是否正确处理重定向。

更新

您将需要手动处理重定向(如果我正确理解 Unity 文档)。

您可以使用UnityWebRequest.GetResponseHeader从位置标头获取重定向 URL

获得位置 URL 后,您应该能够使用Application.OpenURL,如果您使用网络播放器,它将更新浏览器位置。

private  IEnumerator  Connection ( string  name ) {
  WWWForm  form  =  new WWWForm ();
  form . AddField ( "EMAIL" ,  _email );
  form . AddField ( "PASSWORD" ,  passwordUnityEncrypted );
  form . AddField ( "HOST_URL" ,  absoluteURL );
  form . AddField ( "SIGNUP_PATH" ,  _url_signup_route );
  form . AddField ( "LOGIN_PATH" ,  _url_login_route );

  string post_url = "";
  if (absoluteURL == _url_signup) {
    post_url = _url_signup_route;
  } else { 
    post_url = _url_login_route;
  }

  UnityWebRequest request = UnityWebRequest.Post(post_url, form);
  yield  return  request.Send();

  string location = request.GetResponseHeader('location');
  Application.OpenURL(location);
}
Run Code Online (Sandbox Code Playgroud)

我的 C# 很生锈/不存在,因此其中可能存在错误,但这应该为您提供遵循的方向。