Rails 3.1.1中的静态页面和资源

时间:2011-10-07 21:12:54

标签: ruby-on-rails-3 ruby-on-rails-3.1 asset-pipeline

目前正在开展一个项目,在这个项目中我们需要为那些“正常工作”的人不断提供各种静态html页面+静态资产。我们不能让任何人直接编辑html来为资产放置路径。我们需要它简单地工作,以便将html +资产文件夹直接放入/ public,并在生成内容时提供内容。

在生产中测试此行为时,不会出现错误,例如:

ActionController::RoutingError (No route matches [GET] "/some_folder/some-image.png"):

我认为这是我从3.1.x的资产管道中读取的结果。

您如何更改路线以便直接提供这些路线?或者有一种保持这种精确行为的首选方法吗? (最终将部署在heroku上。)

添加更多详细信息,因为当前的评论尚未解决我在解决方案方面的问题:

在我目前的情况下,我直接在WEBrick rails s -e production上运行它来测试它。在开发模式下,这可以正常工作;唯一的例外是production

我也在运行服务器之前运行它: bundle exec rake RAILS_ENV=production RAILS_GROUPS=assets assets:precompile --trace

当我实际尝试在生产中加载页面时,我看到以下输出:

cache: [GET /] miss
cache: [GET /test_files/index.css] miss
cache: [GET /test_files/index.js] miss
cache: [GET /test_files/logo.png] miss
cache: [GET /test_files/background.png] miss
cache: [GET /test_files/horizontal.png] miss
cache: [GET /favicon.ico] miss

5 个答案:

答案 0 :(得分:3)

在进一步审查production.rb后,我看到:“config.serve_static_assets = true”,默认设置为false时,会引起webrick遇到的问题。因此,当将其设置为true时,它会正确地提供文件。

从一些额外的阅读中可能看出,也许Heroku也需要这个设置为假,这是我们正在部署的环境。

感谢您的投入,但这似乎是现在采取的方法,如果这不是正确答案或者有更好的方法,我当然感谢任何进一步的输入。

答案 1 :(得分:2)

从Rails 3.1.1开始,预编译任务会创建非消化文件名和消化文件名,因此您可以在静态文件中引用这些文件(同时在动态文件中仍然具有摘要版本)。

唯一的问题是如果您在assets目录中使用远期标头;对于仍未拥有副本且认为缓存仍然有效的远程客户端,将无法获取未消化文件的更改。

您可能需要查看在部署过程中使用正确名称替换未消化的文件名的方法。

如果您不在目录中使用远期标题,则无关紧要 - 您可以使用任一名称。

答案 2 :(得分:2)

对我来说,@ ylluminate的答案有所帮助:我在 config / environments / production.rb 文件中将 config.serve_static_assets 选项更改为true,然后重新启动服务器与

$rails server --environment=production

现在它提供压缩资产。

注意:我还使用

预编译了资产
$bundle exec rake assets:precompile

(调用 rake 以这种方式确保将使用rake版本为项目选择但我想只使用 rake资产:预编译将在99%的时间内工作)

答案 3 :(得分:1)

如果您实际存在/public/some_folder/some-image.png(无论您是手动复制它还是由资产预编译生成),它都必须有效。服务器(例如Apache)将首先检查所请求的路径是否存在于公共场所,如果它确实存在,它甚至不会调用Ruby on Rails。

就消化的文件名而言,可以选择关闭此功能,但出于其他人已经提到的原因,我不建议这样做。

此外,您可以将引用资产的文件放在app / assets文件夹中,并在结尾处添加.erb扩展名。然后你可以使用<%= asset_path ...%>在该文件中,因此不需要手动编辑。即使您已经对文件进行了一些其他预处理,这也会起作用,例如sass-style.css.scss.erb将起作用。首先将评估erb代码(为资产输入正确的文件名),然后运行sass编译器。

答案 4 :(得分:1)

哦,看看sprockets-image-compressor gem,只需将它添加到你的Gemfile中,它也会自动压缩图像资源(使用pngcrush和jpegoptim无损)...我不知道宝石是不是坚如磐石,但从我所见,我喜欢它!