当我将 Rails + React 应用程序部署到 Heroku 时,我遇到了问题。 React客户端位于Rails应用程序的client/
目录中。由于使用react-router
,Rails服务器需要知道从React构建中呈现index.html
。当我在Heroku上部署客户端时,脚本会将内容从client/build/.
复制到Rails应用程序的public/
目录。
现在问题是:当我的路径检测到像example.com/about这样的路径时,它会尝试渲染public/index.html
。这是方法:
def fallback_index_html
render file: "public/index.html"
end
但是,此文件中的内容不会发送到浏览器。我得到一个空白页面。我在方法中添加了puts "hit fallback_index_html"
并确认此方法正在被命中。我还打开文件放入每一行以确认文件是否具有所需的html(这是从那些put中出现的日志和应该发送到浏览器的内容):
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no">
<meta name="theme-color" content="#000000">
<link rel="manifest" href="/manifest.json">
<link rel="shortcut icon" href="/favicon.ico">
<title>Simple Bubble</title>
<link href="/static/css/main.65027555.css" rel="stylesheet">
</head>
<body><noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"></div>
<script type="text/javascript" src="/static/js/main.21a8553c.js"></script>
</body>
</html>
我尝试的最新修补程序是进入config/environments/production.rb
并将config.public_file_server.enabled
更改为true
。这没有用。
答案 0 :(得分:4)
我正在使用Rails API,因此我的ApplicationController
继承自ActionController::API
而不是ActionController::Base
。
从Rails API文档中可以看出:
默认的API控制器堆栈包括所有渲染器,这意味着您可以在控制器中自由使用render:json和兄弟。请记住,模板不会被渲染,因此您需要确保控制器在所有操作中调用render或redirect_to,否则它将返回204 No Content。
因此Rails API只能呈现HTML!以下内容允许我在不包含ActionController::Base
的所有内容的情况下呈现html。
class ApplicationController < ActionController::API
include ActionController::MimeResponds
def fallback_index_html
respond_to do |format|
format.html { render body: Rails.root.join('public/index.html').read }
end
end
end
我包含ActionController::MimeResponds
的原因是可以访问respond_to
方法。
我的Rails应用程序现在在命中子目录时从我的公共目录呈现index.html,并且我的React客户端/ react-router从那里接管。