问题描述
我已经设置了一个使用 Turbo 的本地 Rails 应用。我正在尝试填充 the Turbo Demo iOS app 以显示我的本地 Rails 应用程序。有没有人做过类似的事情?
我将 Demo.current
切换为使用本地地址,但所有请求都显示“错误加载页面”屏幕,演示应用中没有任何有用的日志。
Rails 应用程序显示我的基本路线正在尝试中,并通过重试 401
错误以某种形式的持久性。我更改了 SceneController
默认 URL 以加载 /networks/all-people
,这需要授权用户(通过 Devise)才能看到身份验证逻辑将如何进行。以下是运行演示应用程序时的 Rails 输出:
Started GET "/networks/all-people" for 127.0.0.1 at 2021-01-21 19:50:26 -0500
Processing by NetworksController#all_people as HTML
Completed 401 Unauthorized in 0ms (Allocations: 256)
Started GET "/users/sign_in" for 127.0.0.1 at 2021-01-21 19:50:26 -0500
Processing by Devise::SessionsController#new as HTML
Rendering layout layouts/application.html.erb
Rendering devise/sessions/new.html.erb within layouts/application
Rendered devise/shared/_links.html.erb (Duration: 0.3ms | Allocations: 218)
Rendered devise/sessions/new.html.erb within layouts/application (Duration: 1.7ms | Allocations: 1056)
Rendered layout layouts/application.html.erb (Duration: 9.4ms | Allocations: 7318)
Completed 200 OK in 10ms (Views: 9.8ms | Allocations: 7945)
有没有人能够将 Demo 应用程序填充到与本地 Rails 服务器一起工作?我完全不确定这里发生了什么问题,或者这里的匀场是否是一个好主意。
Turbo 正在加载,正如从我的浏览器访问时触发的以下事件侦听器所验证的那样。
<script>
document.addEventListener("turbo:load",function(e) {
console.log("TURBO LOADED");
});
</script>
解决方法
要让 Devise 与 Turbo 一起工作,需要做一些事情。
添加app/controllers/turbo_controller
:
# frozen_string_literal: true
class TurboController < ApplicationController
class Responder < ActionController::Responder
def to_turbo_stream
controller.render(options.merge(formats: :html))
rescue ActionView::MissingTemplate => e
raise e if get?
if has_errors? && default_action
render rendering_options.merge(formats: :html,status: :unprocessable_entity)
else
redirect_to navigation_location
end
end
end
self.responder = Responder
respond_to :html,:turbo_stream
end
将 data: { turbo: "false" }
添加到您的设备登录表单:
# app/views/devise/sessions/new.html.erb
<%= form_for(resource,as: resource_name,url: session_path(resource_name),data: { turbo: "false" }) do
更新config/initializers/devise.rb
:
class TurboFailureApp < Devise::FailureApp
def skip_format?
%w[html turbo_stream */*].include?(request_format.to_s)
end
end
config.parent_controller = "TurboController"
config.navigational_formats = ["*/*",:html,:turbo_stream]
config.warden do |manager|
manager.failure_app = TurboFailureApp
end
Detailed explanation 感谢 GoRails!