【问题标题】:Heroku: ActionController::RoutingError (No route matches [GET] "/nav/_nav.html")Heroku:ActionController::RoutingError(没有路由匹配 [GET] "/nav/_nav.html")
【发布时间】:2015-02-24 03:38:12
【问题描述】:

我已经按照说明完成了 Albert Pai 的 AngularJS Tutorial:Learn to Build Modern Web Apps with Angular and Rails。使用 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)

屏幕截图(我缺少允许登录和注册的导航栏,使用了 Device 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

部署到 Heroku 的代码可以在 Github 上找到:https://github.com/jyrkim/flapper-news/blob/master/app/views/layouts/application.html.erb 我还创建了 Procfile 并按照 Heroku 的说明设置了 Puma gem:https://devcenter.heroku.com/articles/getting-started-with-rails4#specify-ruby-version-in-app 我在 Gemfile 中没有指定的唯一内容是红宝石版本。我的 Ubuntu 使用 Ruby 2.1 版,而 Heroku 想为我的应用程序使用 2.0 版。 (也许这可能会导致问题)

如果有人知道 Heroku 环境中可能导致问题的原因,请告诉我 - 谢谢。

【问题讨论】:

  • 我正在做同样的教程,但在 angular-rails-templates 和更改 templateURL: home/_home.html 部分时遇到了真正的困难。你有什么问题吗?我在控制台中收到一条消息,ActionController::RoutingError (No route matches [GET] "/home.html")
  • @PaulFitzgerald 抱歉,我制作教程已经有几个月了,我不太确定我是否遇到过这个问题(尽管我可能也遇到过这个问题,因为有时教程中的代码示例并不总是 100% 覆盖)。尽管如此,最后我在 Stackoverflow 上发布了几个问题后,我得到了教程。关于您的问题,我会检查 home/_home.html 是否存在并且为前一个文件设置了路由。 github.com/jyrkim/flapper-news/tree/master/app/assets/…(github有工作代码,但处于完成阶段)
  • 感谢您的回复。我实际上是通过另一篇 SO 帖子弄明白的——这是链轮的问题。有必要将以下行添加到 gemfile gem 'sprockets', '2.12.3'

标签: angularjs ruby-on-rails-4 heroku


【解决方案1】:

当您第一次部署到 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

【讨论】:

  • 我收到此错误 我收到此错误 ActionController::RoutingError (No route matches [GET] "/users/assets/application.js") 你知道如何解决吗?
猜你喜欢
  • 2015-04-25
  • 2018-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-12
  • 2017-03-21
  • 1970-01-01
相关资源
最近更新 更多