Ресурсы Rails 3.1 не распознают новые изображения, загруженные rmagick, до перезагрузки сервера - PullRequest
5 голосов
/ 13 октября 2011

У меня есть Rails 3.1.0 приложение, работающее с passenger в среде production, и у меня есть раздел, где приложение позволяет пользователю изменять изображение своего профиля, поэтому я загружаю изображение с помощью загрузчика ajax, и в моем контроллере я загрузите файл и сгенерируйте для изображения различные размеры с помощью rmagick, затем я отобразлю новое изображение с image_tag, но приложение не покажет изображение, пока я не перезапущу сервер.

Что я получаю No route matches [GET] "assets/path/to/image.png"

Если я перезапущу сервер, он покажет изображение, но, очевидно, я не могу перезапускать сервер каждый раз, когда пользователь загружает новое изображение.

Как я могу решить, как правильно работать с активами?

1 Ответ

6 голосов
/ 13 октября 2011

Конвейер ресурсов 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

...