Rails不呈现public / index.html文件;浏览器中的空白页面

时间:2018-01-07 18:04:34

标签: ruby-on-rails ruby reactjs heroku react-router

当我将 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。这没有用。

1 个答案:

答案 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从那里接管。