2011-10-13 25 views
5

Tôi có ứng dụng Rails 3.1.0 đang chạy với passenger trong môi trường production và tôi có phần cho phép người dùng thay đổi ảnh tiểu sử của mình để tôi tải hình ảnh lên bằng ajax uploader và trong bộ điều khiển của tôi, tôi upload file và tạo các kích thước khác nhau cho hình ảnh với rmagick sau đó tôi render hình ảnh mới với image_tag nhưng ứng dụng sẽ không hiển thị hình ảnh cho đến khi tôi khởi động lại máy chủ.Đường ray 3.1 nội dung không nhận dạng được hình ảnh mới được tải lên bởi rmagick cho đến khi máy chủ khởi động lại

Những gì tôi nhận được là No route matches [GET] "assets/path/to/image.png"

Nếu tôi khởi động lại máy chủ Nó sẽ hiển thị các hình ảnh, nhưng rõ ràng là tôi không thể khởi động lại máy chủ mỗi người dùng một lần tải lên một hình ảnh mới.

Làm cách nào để tôi có thể giải quyết việc giữ nội dung hoạt động đúng cách?

+0

cập nhật câu trả lời dưới đây .. – Tilo

Trả lời

6

Đường dẫn nội dung Rails thực sự có ý nghĩa cho hình ảnh cấu trúc/thiết kế, chẳng hạn như hình nền, biểu tượng, biểu ngữ, v.v.). Tài sản động phải nằm trong thư mục công cộng [nguồn bên dưới]

Có thể là một ý tưởng tốt để phân phát nội dung tĩnh thông qua Nginx hoặc Apache hoặc bất kỳ máy chủ web nào của bạn hoặc đặt chúng trong thư mục công khai của ứng dụng Rails của bạn.

Điều đó sẽ giải quyết vấn đề của bạn ngay tại đó .. ví dụ: tạo một đường dẫn riêng cho các tài sản tĩnh mà bạn tải lên các hình ảnh đó bằng rmagick/carrierwave hoặc bất kỳ thứ gì bạn thích.

Đường ống nội dung chỉ biết về các hình ảnh hiện diện trong khi khởi động. Vì vậy, việc tách các tài sản tĩnh/tải lên thành một thư mục riêng biệt và phân phát trực tiếp thông qua máy chủ web, sẽ giúp - nó cũng sẽ nhanh hơn nhiều.

bạn sẽ cần một cái gì đó như thế này trong cấu hình của bạn:

# 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 

More chung:

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?

Về phục vụ ima ges bên ngoài đường ống dẫn tài sản:

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

+0

Tình hình là tôi đang triển khai 'Rails 3.1.0' ứng dụng của tôi trên thư mục gốc của máy chủ web của tôi vì vậy tôi không có cách nào khác để phục vụ tệp nhưng để làm điều này máng ứng dụng nó tự sau này chúng tôi sẽ sử dụng một CDN hoặc Am S3 của azon nhưng bây giờ chúng tôi sẽ phục vụ các hình ảnh trên các ứng dụng đường ray, tôi đã thấy cách để vô hiệu hóa các nội dung mặc định trên đường ray 3 nhưng hiện tại chúng tôi đang sử dụng các lợi thế khác khi làm việc với các tài sản và , cảm ơn. –

+0

bạn vẫn có thể thực hiện điều này bên ngoài Rails, ví dụ: nói với máy chủ web Apache hoặc Nginx của bạn để phục vụ một thư mục bổ sung, mà không có một tuyến đường trong Rails. – Tilo

+0

bạn có một số thông tin về điều đó với apache? bởi vì bây giờ tôi đang phục vụ ứng dụng trên thư mục gốc '/' của miền của tôi, Cảm ơn. –

Các vấn đề liên quan