路由与 rails 中的资产冲突 - 仅在生产中

routing conflict with assets in rails - only on production

在我的路由中,我定义了一个带有一些ID的全局类别来加载动态内容:

get "/:global_category/:id" => "pages#index"

路线位于 routes.rb 的底部 。 一切都很容易,没问题,至少在开发方面。 现在我还通过 CSS 将一些网络字体加载到我的应用程序中,当我在生产时,每当我的字体被加载时我都会收到以下异常:

undefined method `id' for nil:NilClass

受影响的 URL 是: http://www.example.com/assets/Sansation_Bold-webfont.woff

我将位于 /assets/fonts 中的字体加载到 sass 文件中,如下所示:

@font-face
  font-family: 'ApolloASM'
  src: url('ApolloASM-webfont.eot')
  src: url('ApolloASM-webfont.eot?#iefix') format('embedded-opentype'), url('ApolloASM-webfont.woff2') format('woff2'),url('ApolloASM-webfont.woff') format('woff'),url('ApolloASM-webfont.ttf') format('truetype'),url('ApolloASM-webfont.svg#apollo_asmregular') format('svg')
  font-weight: normal
  font-style: normal

我的路由和资产管道明显有冲突。 仅在生产环境中(我在 heroku 上部署)我可以重现这个所以我尝试修改我的 production.rb 但是在查看文档后(http://guides.rubyonrails.org/asset_pipeline.html)我仍然不真不知道该怎么办。

我也试过预编译资产。

这似乎不是问题的原因,而且我的字体都已正确加载! 任何提示表示赞赏。

像这样的路由的问题在于它会与您系统上的大量其他路径相匹配。例如,“/users/123”将被解释为 pages#index params={:global_category => "users", :id => 123},而您可能一直期望它转到 users#show params={:id => 123}

像这样的 Catchall 路由需要靠近 routes.rb 文件的底部,这样它们就不会 "steal" 来自其他路由的路径:路由按以下顺序进行测试出现在文件中。

我使用 sass 帮助程序 "font-url" 解决了它:

@font-face
  font-family: 'ApolloASM'
  src: font-url('ApolloASM-webfont.eot')
  src: font-url('ApolloASM-webfont.eot?#iefix') format('embedded-opentype'), font-url('ApolloASM-webfont.woff2') format('woff2'),font-url('ApolloASM-webfont.woff') format('woff'),font-url('ApolloASM-webfont.ttf') format('truetype'),font-url('ApolloASM-webfont.svg#apollo_asmregular') format('svg')
  font-weight: normal
  font-style: normal

无需预编译或在 production.rb 或 application.rb 文件中添加任何内容

确保所有字体都存储在/app/assets/fonts目录中。