Jak odwoływać się do obrazów w CSS w Railsach 4

205

Dziwny problem z Railsami 4 na Heroku. Podczas kompilacji obrazów dodawane są do nich skróty, ale odwołanie do tych plików z CSS nie ma poprawnej nazwy. Oto co mam na myśli. Mam plik o nazwie logo.png. Jednak gdy pojawia się na heroku, jest postrzegane jako:

/assets/logo-200a00a193ed5e297bb09ddd96afb953.png

Jednak CSS nadal stwierdza:

background-image:url("./logo.png");

Wynik: obraz nie wyświetla się. Ktoś na to wpadł? Jak można to rozwiązać?

Nick ONeill
źródło
1
Tylko do wiadomości, Heroku potwierdziło, że to błąd ... pracują nad rozwiązaniem
Nick ONeill
Czy możesz to zaktualizować? Mam ten sam problem
Minh Danh

Odpowiedzi:

392

Koła zębate wraz z Sassem mają sprytnych pomocników, których możesz użyć do wykonania zadania. Zębatki będzie jedynie przetwarzać te pomocników jeśli rozszerzenia plików stylów są albo .css.scssalbo .css.sass.


Pomocnik specyficzny dla obrazu:

background-image: image-url("logo.png")

Pomocnik agnostyczny:

background-image: asset-url("logo.png", image)
background-image: asset-url($asset, $asset-type)

Lub jeśli chcesz osadzić dane obrazu w pliku css:

background-image: asset-data-url("logo.png")
zeeraw
źródło
21
asset-data-urldziała dla mnie po zmianie pliku .css na plik .css.scss w aplikacji Rails 4. Dzięki!
fatman13
@ fatman13 Tak, o ile wiem, działa to tylko z plikami .scss i .sass.
zeeraw
Jeff: Inne działają, pod warunkiem, że opcje adresu URL zasobu są skonfigurowane poprawnie. Nie dotyczy, asset-data-urlponieważ osadza cały plik w arkuszu stylów.
zeeraw
1
Podobny do @ fatman13 ponieważ używałem sass-railsale w końcu skończyło się dodając rozszerzenie pliku .scssdo pliku przestępstwa .css (S) więc wszystko skończy się .css.scss, a następnie zastąpić wszystkie wystąpienia url('blah.png')z url(asset-path('blah.png'))(w moim przypadku wszystkie blah.pngs były w /vendored teczka).
likethesky
asset-url($asset)powinien być używany do kół łańcuchowych 3, wersja $asset-typeprawdopodobnie działa z niektórymi starszymi wersjami
prusswan
59

Nie wiem dlaczego, ale jedyną rzeczą, która pracowała dla mnie było za pomocą asset_path zamiast z IMAGE_PATH , chociaż moje obrazy są pod assets / images / katalogu:

Przykład:

app/assets/images/mypic.png

W Ruby:

asset_path('mypic.png')

W .scss:

url(asset-path('mypic.png'))

AKTUALIZACJA:

Zorientowałem się, że okazuje się, że ci pomocnicy zasobów pochodzą z klejnotu sass-rails (który zainstalowałem w moim projekcie).

Yarin
źródło
2
działa dla mnie, naprawdę bardzo dobre rozwiązanie dla szyn. Dzięki @Yarin
AMIC MING
1
Tak! Po kilku godzinach walenia głową w ścianę twoje rozwiązanie „ścieżki zasobów” w końcu zadziałało w moim pliku .css.scss! background-image: url(asset-path('off.png'))
Raymond Gan,
36

W Rails 4 możesz łatwo odwoływać się do obrazu znajdującego się assets/images/w twoich .SCSSplikach:

.some-div {
  background-image: url(image-path('pretty-background-image.jpg'));
}

Po uruchomieniu aplikacji w trybie programowania ( localhost:3000) powinieneś zobaczyć coś takiego:

background-image: url("/assets/pretty-background-image.jpg");

W trybie produkcyjnym Twoje zasoby będą miały numery pomocnicze pamięci podręcznej:

background-image: url("/assets/pretty-background-image-8b313354987c309e3cd76eabdb376c1e.jpg");
sergserg
źródło
1
@MikeLyons: Właśnie przetestowałem go w nowym projekcie Rails 4.1 i wdrożyłem w Heroku i działa dla mnie dobrze. Musiałeś coś dotknąć production.rb.
sergserg
25

Haszowanie jest spowodowane tym, że potok zasobów i serwer Optymalizuj buforowanie http://guides.rubyonrails.org/asset_pipeline.html

Wypróbuj coś takiego:

 background-image: url(image_path('check.png'));

Powodzenia

Mauro Dias
źródło
Pracował dla mnie! Dzięki :)
Daniel
W twoim przypadku jakie powinno być rozszerzenie pliku? Tylko .cssmi nie działało.
Arup Rakshit
Pracuj dla mnie! Dzięki stary!
AlejandroJSR7,
11

W css

background: url("/assets/banner.jpg");

chociaż oryginalna ścieżka to /assets/images/banner.jpg, zgodnie z konwencją musisz dodać po prostu / asset / w metodzie url

użytkownik2458192
źródło
1
Używając zwykłego CSS, myślałem, że oszaleję - dziękuję!
Craig McGuff,
2
to nie zostanie skompilowane w produkcji
dimitry_n
Wow, dziękuję, to nie jest bardzo intuicyjne. Więc myślę, że wszystkie aktywa w ścieżkach aktywów ( vendor/assets, app/assets, lib/assets, etc) się połączyć w jedną aktywów folderze po ujmujący jest kompletny?
ohhh,
To nie zadziała w Production, ponieważ w Production twoje zasoby zostaną skompilowane z uzyskaniem skrótu MD5 na końcu nazwy i przy typowych ustawieniach /assets/banner.jpgnie będą działać. Zamiast tego będzie to coś w rodzaju /assets/banner-f719451f1e0ddd15f153c4eedde044b2.jpg. TL; DR Nie używaj tego.
Joshua Pinter,
10

Żadna z odpowiedzi nie mówi o tym, w jaki sposób będę mieć .css.erbrozszerzenie, jak odwoływać się do obrazów . Dla mnie pracował zarówno w produkcji, jak i rozwoju :

2.3.1 CSS i ERB

Potok zasobów automatycznie ocenia ERB . Oznacza to, że jeśli dodasz rozszerzenie erb do zasobu CSS (na przykład application.css.erb), wtedy pomocnicy tacy asset_pathsą dostępni w twoich regułach CSS:

.class { background-image: url(<%= asset_path 'image.png' %>) }

Spowoduje to zapisanie ścieżki do konkretnego zasobu, do którego następuje odwołanie. W tym przykładzie sensowne byłoby posiadanie obrazu w jednej ze ścieżek ładowania zasobów, na przykład takiej app/assets/images/image.png, do której można by się tutaj odwoływać. Jeśli ten obraz jest już dostępny public/assetsjako plik odcisków palców, wówczas ścieżka jest przywoływana.

Jeśli chcesz użyć identyfikatora URI danych - metody osadzania danych obrazu bezpośrednio w pliku CSS - możesz użyć asset_data_uripomocnika.

.logo { background: url(<%= asset_data_uri 'logo.png' %>) }

To wstawia poprawnie sformatowany identyfikator URI danych do źródła CSS.

Pamiętaj, że tag zamykający nie może mieć stylu -%>.

Arup Rakshit
źródło
5

Tylko ten fragment kodu nie działa dla mnie:

background-image: url(image_path('transparent_2x2.png'));

Ale zmiana nazwy stylename.scss na stylename.css.scss pomaga mi.

s.vatagin
źródło
4

Odwołując się do dokumentów Railsów , widzimy, że istnieje kilka sposobów na linkowanie do obrazów z css. Wystarczy przejść do sekcji 2.3.2.

Po pierwsze, upewnij się, że plik css ma rozszerzenie .scss, jeśli jest to plik sass.

Następnie możesz użyć metody ruby, która jest naprawdę brzydka:

#logo { background: url(<%= asset_data_uri 'logo.png' %>) }

Lub możesz użyć konkretnego formularza, który jest ładniejszy:

image-url("rails.png") returns url(/assets/rails.png)
image-path("rails.png") returns "/assets/rails.png"

Na koniec możesz użyć formularza ogólnego:

asset-url("rails.png") returns url(/assets/rails.png)
asset-path("rails.png") returns "/assets/rails.png"
Nick Res
źródło
3

CO ZNALAZŁEM PO GODZINACH MUCKINGU TO:

PRACUJE :

background-image: url(image_path('transparent_2x2.png')); 

// how to add attributes like repeat, center, fixed?

Powyższe dane wyjściowe wyglądają następująco: "/assets/transparent_2x2-ec47061dbe4fb88d51ae1e7f41a146db.png"

Zwróć uwagę na wiodące „/” i jest ono w cudzysłowie . Zwróć również uwagę na rozszerzenie scss i pomocnika image_path w pliku yourstylesheet.css.scss. Obraz znajduje się w katalogu app / asset / images .

Nie działa:

background: url(image_path('transparent_2x2.png') repeat center center fixed;

nie działa, nieprawidłowa właściwość:

background:url(/assets/pretty_photo/default/sprite.png) 2px 1px repeat center fixed;

Moją ostatnią deską ratunku było umieszczenie ich w moim publicznym wiaderku s3 i załadowanie stamtąd, ale w końcu coś się zaczęło.

Danny
źródło
Dla każdego, kto tu przyjeżdża i nadal ma problemy: Upewnij się, że plik css jest zaktualizowany i że nie dokonałeś wstępnej kompilacji zasobów lokalnie i zapomniałeś o ich aktualizacji.
Hartwig
Hartwig - co to znaczy? Czy masz na myśli, że musisz ponownie uruchomić prekompilację, zanim ta metoda zadziała? Próbowałem wszystkiego sugerowanego w tym poście (wszystko) i nic dla mnie nie działa
Mel
2

Co ciekawe, jeśli użyję „obrazu tła”, to nie działa:

background-image: url('picture.png');

Ale po prostu „tło”:

background: url('picture.png');
AnderSon
źródło
ale to działa tylko z pliku scss, a nie w przypadku przypisania właściwości stylu do div ... Jestem zdezorientowany
AnderSon
1

Podczas korzystania z klejnotów „sass-rails” w Rails 5, bootstrap 4, działało dla mnie:

w pliku .scss:

    background-image: url(asset_path("black_left_arrow.svg"));

w pliku widoku (np. .html.slim):

    style=("background-image: url(#{ show_image_path("event_background.png") })");
Mehreen
źródło
0

To powinno cię tam zabrać za każdym razem.

background-image: url(<%= asset_data_uri 'transparent_2x2.png'%>);
Joshua Nathaniel
źródło
0

Domyślnie Rails 4 nie obsługuje twoich zasobów. Aby włączyć tę funkcję, musisz przejść do config / application.rb i dodać ten wiersz:

config.serve_static_assets = true

https://devcenter.heroku.com/articles/rails-4-asset-pipeline#serve-assets

ksiomelo
źródło
1
To działa, ale czy nie cofnęłoby to korzyści wynikających z prekompilacji aktywów?
Arcolye,
0

W Rails 4 po prostu użyj

.hero { background-image: url("picture.jpg"); }

w pliku style.css, o ile obraz tła jest schowany w app / asset / images.

boussac
źródło
Przeczytaj pełne pytanie
Adriano Resende
0

Możesz dodać do swojego rozszerzenia css .erb. Ej: style.css.erb

Następnie możesz umieścić:

background: url(<%= asset_path 'logo.png' %>) no-repeat;
Matias Seguel
źródło
0

To działało dla mnie:

background: #4C2516 url('imagename.png') repeat-y 0 0;
Tolome
źródło