【问题标题】:Ruby on Rails controller redirect not happening with WEBGL runningRuby on Rails 控制器重定向未在 WEBGL 运行时发生
【发布时间】:2018-11-07 05:10:45
【问题描述】:

我在 Rails 静态页面中嵌入了一个 WEBGL 播放器,如下所示:

<% 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>

当用户点击按钮时,它会加载 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>

这会成功加载并实际启动用户控制器以保存新用户并启动“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

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

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

[2018-11-07T05:04:21.896891 #20] 信息 -- : [c5de6e8e-58e2-4177-ae17-e1f58fbb65ee] 开始 POST "/signup" 76.120.71.73 在 2018-11-07 05:04:21 +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 应用程序[web.1]:我,[2018-11-07T05:04:21.901036 #20] 信息——: [c5de6e8e-58e2-4177-ae17-e1f58fbb65ee] 参数: {"EMAIL"=>"jakeywtf34@gmail.com", "PASSWORD"=>"[FILTERED]"}

2018-11-07T05:04:21.902007+00:00 应用 [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 应用程序[web.1]:D, [2018-11-07T05:04:22.145463 #20] 调试——: [c5de6e8e-58e2-4177-ae17-e1f58fbb65ee] [1m[36m用户存在 (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 应用[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") 值 ($1, $2, $3, $4) 返回 "id"[0m [[“电子邮件”,“jakeywtf34@gmail.com”],[“created_at”,“2018-11-07 05:04:22.146010"], ["updated_at", "2018-11-07 05:04:22.146010"], [“密码摘要”, "$2a$10$g.RhGJDfl23/zPDeyXEI.OcnsfKfYH3jE4GB7py6/ktMJ3N6y73OW"]]

2018-11-07T05:04:22.153387+00:00 应用[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 应用[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 应用[web.1]:我,

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

[2018-11-07T05:04:22.221705 #6] 信息 -- : [972376e5-2f11-4985-91fe-53b071181359] 开始 GET "/users/126" for 76.120.71.73 在 2018-11-07 05:04: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 应用[web.1]:我,

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

2018-11-07T05:04:22.156370+00:00 heroku[路由器]: at=info method=POST path="/signup" 主机=immense-castle-53592.herokuapp.com request_id=c5de6e8e-58e2-4177-ae17-e1f58fbb65ee fwd="76.120.71.73" dyno=web.1 连接=1ms 服务=264ms 状态=302 字节=559 协议=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 "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2[0m [["id", 126], ["LIMIT", 1]]

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

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

[2018-11-07T05:04:22.470487 #6] 信息 -- : [972376e5-2f11-4985-91fe-53b071181359] 渲染用户/show.html.erb 在布局/应用程序内(1.0 毫秒)2018-11-07T05:04:22.484847+00:00 应用[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 应用[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 应用[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 应用[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 应用[web.1]:我,

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

2018-11-07T05:04:22.544712​​+00:00 heroku[路由器]: at=info method=GET path="/users/126" 主机=immense-castle-53592.herokuapp.com request_id=972376e5-2f11-4985-91fe-53b071181359 fwd="76.120.71.73" dyno=web.1 连接=1ms 服务=324ms 状态=200 字节=2692 协议=https

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

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

  <%= f.label :password %>
  <%= f.password_field :password, class: 'form-control' %>

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

更新 12-6-18:

我注意到,当重定向由 WEBGL 启动(不成功)时,我在日志中得到:UsersController#show as / 处理。如果我从普通的 html 表单重定向(成功),我会在日志中得到这个:UsersController#show as HTML 处理。这是日志中唯一的区别。

我已经测试了以下内容:

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

游戏实例中适用的 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 ();
    }

【问题讨论】:

  • 对任何有帮助的建议表示赞赏。

标签: ruby-on-rails unity3d iframe unity-webgl


【解决方案1】:

我在这里做了几个假设,但我假设 gameInstance 后面的 javascript 正在提交发布请求,如果是这种情况,那么我会检查它是否正确处理了重定向。

更新

您需要手动处理重定向(如果我正确理解 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);
}

我的 C# 已生锈/不存在,因此其中可能存在错误,但这应该会给您指明遵循的方向。

【讨论】:

  • 谢谢马特!我在发出请求的 gameInstance 中添加了统一模型中形成 WEBGL 的 C# 代码。重定向由用户控制器作为请求的结果启动。我不知道如何检查 gameInstance 是否正确处理重定向。
  • 照原样,Appication.OpenURL(location) 打开 'mindpass.herokuapp.com/demo',这是打开原始游戏实例的 url。我不确定这是因为“位置”作为“mindpass.herokuapp.com/demo”传递,还是 GetResponseHeader 返回 null,导致 Application.OpenURL(location) 中的“位置”为空,以打开当前 url。
  • 我还尝试从 users_controller 设置自定义标头“locationUser”,然后使用 locationUser 而不是 GetResponseHeader 的位置。结果相同。我需要进一步研究一下。
  • 我尝试将任意链接设置为重新路由的响应标头,然后使用 GetResponseHeader 获取它并通过 Application.OpenURL 打开。有效。现在我只需要检索并发送正确的 URL 作为响应头,它应该可以工作。会更新。很遗憾,如果没有手动路线,我无法重定向,但您确认这是绝对必要的非常有帮助。
  • 太棒了!乐于助人。
【解决方案2】:

您需要使用 Unity 处理 Javascript 中的重定向。基本上类似于document.location = "http://example.com",但是从请求的响应中获取example.com(如果响应是JSON并且路径被重定向到嵌入在里面会更好)

【讨论】:

  • 您是否建议对 gameInstance 进行编码,以便在注册时识别 rails 发起的请求,其中包含重定向地址?如果是这样,它会根据条件启动这样的事情吗? Application.OpenURL("immense-castle-53592.herokuapp.com/users/98")
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多