2009-02-10 9 views
14

Przeanalizowałem kilka interesujących problemów z routingiem - zamieniłem adres URL żądania w hash itp., Ale tylko z ciekawości, czy istnieje sposób, aby powiedzieć systemowi routingu, że chcesz, aby wszystko, co pochodzi pod pewną podrzędną ścieżką, było podawane dosłownie - bez przechodzenia przez kontroler?Railsy: Trasa do obsługi zasobów statycznych (jak .jpgs, itp.?)

Na przykład, jeśli mam /home/me/public_html/rails_proj/images/foo.jpg i .../rails_proj/images/other/bar.jpg, czy mogę wstawić trasę z napisem "cokolwiek pod obrazy powinny być po prostu wyświetlane jako obiekt domyślnego typu MIME? "

Może być interesująco.

Odpowiedz

15

Jeśli umieścisz katalog "images" w "publicznym" folderze aplikacji Rails (na przykład:/public/images /), nie powinieneś mieć żadnych problemów z typami MIME, chyba że twój serwer jest źle skonfigurowany .

Zgodnie z przykładami, chcesz, aby katalog obrazów znajdował się w katalogu głównym aplikacji. Nie sądzę, by Railsy miały jakiś sposób, aby te obrazy były widoczne, ale jeśli naprawdę chciałbyś, możesz użyć mod_rewrite, aby to działało. Ponownie, serwer WWW powinien upewnić się, że obrazy mają prawidłowy typ MIME.

+0

Nie mam problemu z przenoszeniem obrazów do folderu publicznego. Zrobię trochę googlowania - umieszczenie zasobów nadal daje mi "Brak dopasowania trasy ............. z {: method =>: get} – Sniggerfardimungus

+1

Problem z folderem publicznym jest Próbowałem adresu url/public/... Odrzuciłem jawne użycie/public/i działało dobrze. – Sniggerfardimungus

+0

To uderzyło mnie, że jednym z powodów, aby zrobić to bezpośrednio w szynach jest przypadek, w którym pracujesz serwer jako skrypt/serwer. Powiedziałbym, że umieszczenie ich pod publicznością wydaje się działać dla mnie, pod warunkiem, że pamiętam, że faktycznie mam tam pliki. :) (Ups, dlaczego dostałem to pytanie.) – lindes

6

Rzeczy obsługiwane z katalogu publicznego nie będą przechodzić przez Railsy - będą one obsługiwane przez serwer (prawdopodobnie apache). Jedynym powodem, dla którego musisz wyświetlać obrazy za pośrednictwem systemu szyn, jest to, czy chcesz mieć jakąś kontrolę nad tym, kto może uzyskać do nich dostęp. Po prostu dodaj wszystkie pozostałe informacje do publicznej wiadomości i uzyskaj dostęp do następujących informacji: siteurl.whatever/images/* .jpg

+0

Wydaje mi się, że głównym powodem, dla którego ktoś chciałby, aby szyny wyświetlały obraz bezpośrednio, jest serwer programistyczny, gdy jest uruchamiany jako zwykły skrypt/serwer. – lindes

1

Zastrzeżenie: jeśli adres URL twojego zapytania pasuje do statycznego zasobu, WEBrick, kundel lub cokolwiek mu się podoba. Za wszelką cenę nie chcesz tego produkować: jeśli twój ruch jest wystarczająco wysoki, twoja aplikacja zostanie przyciśnięta do kolan tylko dlatego, że jego kundle będą zajęte serwowaniem statycznej zawartości.

Dlatego upewnij się, że Twój serwer internetowy jest odpowiednio skonfigurowany pod kątem wszystkich rodzajów zawartości statycznej, jak wskazali poprzedni komentatorzy.

5

Zwykle używam nginx jako interfejsu i Apache/Passenger jako zaplecza. Ngingx prosi wszystkie żądania Rails do Apache, ale sam obsługuje wszystkie statyczne treści. Sprawdź przykłady na stronie the English nginx wiki. Oto mały wyciąg dla nginx config:

server { 
    listen 80; 
    server_name www.domain.com; 
    location ~* \.(jpg|jpeg|gif|png|ico|css|bmp|js)$ { 
     root /path/to/static/assets/dir; 
    } 
    location/{ 
     proxy_pass http://127.0.0.1:81; 
    } 
} 

mają tak apache nasłuchuje na porcie 81 obsłużyć Rails zwraca proxy przez nginx i niech nginx dostarczania zawartości statycznej. Nie tylko nginx jest podobno szybszy od Apache przy dostarczaniu statycznej treści, ale także odciąża twoją aplikację Railsową dla każdego obrazu, arkusza stylów, javascript lub jakiejkolwiek innej statycznej zawartości.

2

Myślę, że najprostszym sposobem rozwiązania tego problemu jest użycie metody helpera image_path, która zapewnia ścieżkę do obrazu, który chcesz wyświetlić w widoku. Na przykład, jeśli chcesz odsłonić logo.png pod /assets/images/logo.png, możesz po prostu użyć image_path ('logo.png').

Powiązane problemy