我有一个rails应用程序,我刚刚移动到服务器。某些配置已关闭,我的网页样式都没有加载。 rails控制台为每个资产(图像,javascript和样式表)提供:ActionController::RoutingError (No route matches [GET] "/images/search-icon.png")
。
这可能发生在哪里?
主要区别在于我正在以生产模式启动。
答案 0 :(得分:2)
Rails 3.1带来了“资产管道”。随着它的推出,资产(图像,样式表,javascripts)的服务在生产中的工作方式不同。
在开发/测试环境中,rails应用程序通过基于配置进行连接,缩小和/或压缩来处理资产。
但是在生产中,预计资产会通过以下rake任务预编译到公共目录:
bundle exec rake assets:precompile
您的应用程序可以配置为由rails应用程序提供的资产,或者(按照惯例)由Web服务器提供。
看起来你没有预编译资产,这就是rails无法提供不存在的文件的原因。
访问Asset Pipeline了解详情。
答案 1 :(得分:1)
这可能发生在哪里
要添加答案,因为asset fingerprinting
。
每当您将应用推向生产时,默认情况下,Rails会将您的资产连接到您已定义的任何manifest files(通常为application.css
):
sprockets用于指纹识别的技术是将内容的哈希值插入到名称中,通常在末尾。例如CSS文件global.css
global-908e25f4bf641868d8683022a5b62f54.css
这适用于您的image
,js
,font
,video
& audio
资产。
在生产中调用图像资源时,Rails 仅可以访问public
文件夹(precompilation
将所有资产放入public/assets
):
public/assets/images/search-icon[[hash]].png
在CSS中调用url("assets/images/search-icon.png")
,或者显式引用应用的任何部分中的图片都无法正常工作。您必须引用预编译资产,这可以通过各种asset_path
helpers(例如image-url
)实现最佳效果:
#app/assets/stylesheets/application.scss
.class {
background: image-url("search-icon.png");
}
答案 2 :(得分:0)
您未使用资产助手,因此路径与生产中生成的资产管道路径不匹配。阅读The Asset Pipeline Guide,尤其是Coding Links to Assets部分。
您还没有显示您用于生成路径的代码,因此我无法提供具体的解决方案,但上述链接包含有ERB的CSS信息以及你正在使用Sass模板。