У меня есть Rails 3.1.0 приложение, работающее с passenger в среде production, и у меня есть раздел, где приложение позволяет пользователю изменять изображение своего профиля, поэтому я загружаю изображение с помощью загрузчика ajax, и в моем контроллере я загрузите файл и сгенерируйте для изображения различные размеры с помощью rmagick, затем я отобразлю новое изображение с image_tag, но приложение не покажет изображение, пока я не перезапущу сервер.
Rails 3.1.0
passenger
production
image_tag
Что я получаю No route matches [GET] "assets/path/to/image.png"
No route matches [GET] "assets/path/to/image.png"
Если я перезапущу сервер, он покажет изображение, но, очевидно, я не могу перезапускать сервер каждый раз, когда пользователь загружает новое изображение.
Как я могу решить, как правильно работать с активами?
Конвейер ресурсов Rails действительно предназначен для структурных / дизайнерских изображений, таких как фоны, значки, баннеры и т. Д.). Динамические ресурсы должны находиться в публичном каталоге [источник ниже]
Вероятно, хорошей идеей будет обслуживать статические ресурсы через Nginx, Apache или любой другой веб-сервер или помещать их в публичный каталог вашего приложения Rails.
Это должно решить вашу проблему прямо здесь .. например. создайте отдельный путь для статических ресурсов, в которые вы загружаете эти изображения с помощью rmagick / carrierwave или любого другого драгоценного камня, который вы предпочитаете.
Конвейер ресурсов знает только об изображениях, которые присутствуют при запуске. Таким образом, разделение статических / загруженных ресурсов в отдельный каталог и их прямое обслуживание через веб-сервер помогут - это также должно быть намного быстрее.
вам понадобится что-то подобное в вашей конфигурации:
# 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: следует ли добавлять загрузки файлов в конвейер ресурсов?
Относительно обслуживания изображений вне конвейера активов:
http://mrjaba.posterous.com/rails-31-asset-pipeline-with-nginx-and-passen
http://trackingrails.com/posts/rails-31-and-asset-pipeline-problems-with-apache
http://pastebin.com/kC4Ba40U
https://github.com/defunkt/resque/issues/418