Heroku:ActionController::RoutingError(没有路由匹配 [GET]“/nav/_nav.html”)

Heroku: ActionController::RoutingError (No route matches [GET] "/nav/_nav.html")

我已经按照说明完成了 Albert Pai 的 AngularJS Tutorial: 学习使用 Angular 和 Rails 构建现代 Web 应用程序。使用 WEBrick 和 Foreman 时,我的应用程序在本地运行。然而,在将相同的应用程序部署到 Heroku 之后,我 运行 遇到以下 AngularJS 语句的问题:

<div ng-include="'nav/_nav.html'"></div>

与 Heroku 服务器一样,未找到 _nav.html 部分视图。所以我得到以下错误:

GET http://fathomless-sands-8666.herokuapp.com/nav/_nav.html 404 (Not Found)

屏幕截图(我缺少允许登录和注册的导航栏,使用设备 gem):

application.html.erb

<!DOCTYPE html>
<html>
<head>
 <title>FlapperNews</title>
  <%= stylesheet_link_tag    'application', media: 'all' %>
  <%= javascript_include_tag 'application' %>
  <%= csrf_meta_tags %>
</head>
<body ng-app="flapperNews">
    <p class="notice"><%= notice %></p>
    <p class="alert"><%= alert %></p>
    <div class="col-md-6 col-md-offset-3">
      <div ng-include="'nav/_nav.html'"></div>
      <ui-view></ui-view>
    </div>
</body>
</html>

_nav.html

<div class="collapse navbar-collapse pull-right" ng-controller="NavCtrl">
  <ul class="nav navbar-nav">
    <li><a href="#/home">Home</a></li>
    <li ng-hide="signedIn()"><a href="#/login">Log In</a></li>
    <li ng-hide="signedIn()"><a href="#/register">Register</a></li>
    <li ng-show="signedIn()"><a href="#/">{{ user.username }}</a></li>
    <li ng-show="signedIn()"><a ng-click="logout()">Log Out</a></li>
  </ul>
</div>

Heroku 日志:

2015-02-23T12:26:14.936469+00:00 heroku[router]: at=info method=GET path="/assets/application-71f8573cbf92d37602f8bd1449f54ed5.js" host=fathomless-sands-8666.herokuapp.com request_id=6695089f-3134-4397-81da-6832439bc1a4 fwd="212.149.201.185" dyno=web.1 connect=0ms service=10ms status=200 bytes=166290
2015-02-23T12:26:15.938797+00:00 heroku[router]: at=info method=GET path="/favicon.ico" host=fathomless-sands-8666.herokuapp.com request_id=61831df5-456c-492b-a315-f0c13faa64cf fwd="212.149.201.185" dyno=web.1 connect=0ms service=3ms status=200 bytes=143
2015-02-23T12:26:15.957956+00:00 heroku[router]: at=info method=GET path="/nav/_nav.html" host=fathomless-sands-8666.herokuapp.com request_id=c40773c6-2f68-4533-b2a3-d9a1bad30ce7 fwd="212.149.201.185" dyno=web.1 connect=0ms service=59ms status=404 bytes=1531
2015-02-23T12:26:15.898369+00:00 app[web.1]: source=rack-timeout id=c40773c6-2f68-4533-b2a3-d9a1bad30ce7 wait=2ms timeout=20000ms state=ready
2015-02-23T12:26:15.935577+00:00 app[web.1]: source=rack-timeout id=61831df5-456c-492b-a315-f0c13faa64cf wait=2ms timeout=20000ms state=ready
2015-02-23T12:26:15.955427+00:00 app[web.1]: 
2015-02-23T12:26:15.955433+00:00 app[web.1]: ActionController::RoutingError (No route matches [GET] "/nav/_nav.html"):
2015-02-23T12:26:15.955437+00:00 app[web.1]:   vendor/bundle/ruby/2.0.0/gems/actionpack-4.0.2/lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'

routes.rb

FlapperNews::Application.routes.draw do
  devise_for :users
  root to: 'application#angular'
  resources :posts, only: [:create, :index, :show] do
    resources :comments, only: [:show, :create] do
      member do
        put '/upvote' => 'comments#upvote'
      end
    end

    member do
      put '/upvote' => 'posts#upvote'
    end
  end

可以在 Github 找到部署到 Heroku 的代码: https://github.com/jyrkim/flapper-news/blob/master/app/views/layouts/application.html.erb I have also created Procfile and set the Puma gem as instructed at Heroku: https://devcenter.heroku.com/articles/getting-started-with-rails4#specify-ruby-version-in-app 我唯一没有在 Gemfile 中指定的是 Ruby 版本。我的 Ubuntu 使用 Ruby 2.1 版,Heroku 想为我的应用程序使用 2.0 版。 (也许这会导致问题)

如果有人知道是什么导致了 Heroku 环境的问题,请告诉我 - 谢谢。

当您第一次部署到 Heroku 时(因为您的 public/assets 目录中有较旧的文件),您 运行 似乎在本地进行了资产预编译,但自那以后就没有再 运行 它了对站点进行进一步更改并重新部署到 Heroku。

这意味着您预编译的 JS 与您的 application.html.erb 不一致。您从 Heroku 提供的 JS 是在 nav/_nav.html 创建之前编译的,此后一直没有更新。

您可以在本地再次运行资源预编译:

RAILS_ENV=production bundle exec rake assets:precompile

或者删除 public/assets 目录,提交并重新部署,以便 Heroku 在 slug 编译期间执行资产预编译步骤作为部署的一部分。这样做意味着您以后不必担心 运行在本地执行 rake 任务。

https://devcenter.heroku.com/articles/rails-asset-pipeline