我的Rails 3.1.0
应用程序在passenger
环境中运行production
,我有一个应用程序允许用户更改其个人资料图片的部分,因此我使用ajax上传图像上传器并在我的控制器中上传文件并使用rmagick为图像生成不同的大小然后我使用image_tag
呈现新图像,但应用程序将不会显示图像,直到我重新启动服务器。
我得到的是No route matches [GET] "assets/path/to/image.png"
如果我重新启动服务器它将显示图像,但显然我无法在用户上传新图像时重新启动服务器。
如何解决保持资产以正确方式运作的问题?
答案 0 :(得分:6)
Rails资产管道实际上是用于结构/设计图像,例如背景,图标,横幅等。)。动态资产应该放在公共目录[来源] [/ p>]
通过Nginx或Apache或任何网络服务器提供静态资产可能是一个好主意,或者将它们放在Rails应用程序的公共目录中。
那应该可以解决你的问题......例如为静态资产创建一个单独的路径,您可以使用rmagick / carrierwave或您喜欢的任何宝石上传这些图像。
资产管道只知道启动期间存在的图像。因此,将静态/上载的资产分离到一个单独的目录中,并通过Web服务器直接提供它将有所帮助 - 它也应该更快。
在配置中你需要这样的东西:
# Disable Rails's static asset server (Apache or nginx will already do this)
config.serve_static_assets = false
# Compress JavaScripts and CSS
config.assets.compress = true
# Don't fallback to assets pipeline if a precompiled asset is missed
config.assets.compile = false
# Generate digests for assets URLs
config.assets.digest = true
# UNCOMMENT the header that your server uses for sending files
# config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache
# config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx
更多一般:
http://railscasts.com/episodes/279-understanding-the-asset-pipeline
http://guides.rubyonrails.org/asset_pipeline.html
Rails 3.1: Should File Uploads be added to asset pipeline?
关于在资产管道外提供图像:
http://mrjaba.posterous.com/rails-31-asset-pipeline-with-nginx-and-passen
http://trackingrails.com/posts/rails-31-and-asset-pipeline-problems-with-apache