Rails: jak odwoływać się do obrazów w CSS w Rails 4

Jest dziwny problem z Rails 4 na Heroku. Gdy obrazy są kompilowane, dodawane są do nich skróty, jednak odniesienia do tych plików z CSS nie mają dostosowanej właściwej nazwy. Oto co mam na myśli. Mam plik o nazwie logo.png. Jednak kiedy pojawia się na heroku, jest postrzegany jako:

/assets/logo-200a00a193ed5e297bb09ddd96afb953.png

Jednak CSS nadal stwierdza:

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

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

Author: Promise Preston, 2013-03-06

17 answers

Sprockets wraz z Sass ma kilka sprytnych pomocników można użyć, aby wykonać zadanie. Sprockets będzie tylko przetwarzać te helpery, jeśli rozszerzenia plików arkusza stylów są .css.scss lub .css.sass.


Pomocnik specyficzny dla obrazu:

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

Agnostic helper:

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")
 397
Author: zeeraw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-14 19:02:08

Nie wiem dlaczego, ale jedyną rzeczą, która działała dla mnie było użycie asset_path zamiast z image_path , mimo że moje obrazy znajdują się w kataloguassets/images/:

Przykład:

app/assets/images/mypic.png

W Ruby:

asset_path('mypic.png')

Do środka .scss:

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

UPDATE:

Zorientowałem się - okazuje się, że pomocnicy aktywów pochodzą z sass-rails gem (który zainstalowałem w moim projekt).

 60
Author: Yarin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-23 18:28:53

W Rails 4 możesz łatwo odwoływać się do obrazu znajdującego się w assets/images/ w Twoich plikach .SCSS w następujący sposób:

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

Po uruchomieniu aplikacji w trybie deweloperskim (localhost:3000) powinieneś zobaczyć coś w stylu:

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");
 36
Author: sergserg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-24 15:56:20

Hash jest spowodowany tym, że rurociąg zasobów i serwer optymalizują buforowanie http://guides.rubyonrails.org/asset_pipeline.html

Spróbuj czegoś takiego:

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

Goodluck

 25
Author: Mauro Dias,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-23 20:55:46

W css

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

Chociaż oryginalną ścieżką jest / assets / images / banner.jpg, zgodnie z konwencją musisz dodać just / assets / w metodzie url

 11
Author: user2458192,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-19 06:23:57

Żadna z odpowiedzi nie mówi o sposobie, kiedy będę miał .css.erb rozszerzenie, jak odwołać obrazy . Dla mnie pracował zarówno w produkcji i rozwoju jak również:

2.3.1 CSS i ERB

Potoku zasobów automatycznie ocenia ERB . Oznacza to, że jeśli dodasz rozszerzenie erb do zasobu CSS (na przykład application.css.erb), to helpery takie jak asset_path są dostępne w Twoich regułach CSS:

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

To zapisuje ścieżkę do konkretnego składnika aktywów, do którego się odwołuje. W tym przykładzie sensowne byłoby umieszczenie obrazu w jednej ze ścieżek ładowania zasobu, np. app/assets/images/image.png, do której się tutaj odwołujemy. Jeśli ten obraz jest już dostępny w public/assets jako plik z odciskami palców, to ta ścieżka jest odwoływana.

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

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

Wstawia poprawnie sformatowany URI danych do Źródło CSS.

zauważ, że znacznik zamykający nie może być w stylu -%>.

 10
Author: Arup Rakshit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-15 16:26:12

Tylko ten fragment mi nie działa:

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

Ale zmień nazwę nazwa_pliku.scss do stylename.css.scss mi pomaga.

 5
Author: s.vatagin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-24 06:46:22

Odwołując się do rails documents widzimy, że istnieje kilka sposobów łączenia obrazów z css. Wystarczy przejść do sekcji 2.3.2.

Najpierw 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ć konkretnej formy, która jest ładniejsza:

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

Na koniec możesz użyć ogólnej formy:

asset-url("rails.png") returns url(/assets/rails.png)
asset-path("rails.png") returns "/assets/rails.png"
 4
Author: Nick Res,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-05 19:47:58

CO ZNALAZŁEM PO GODZINACH MUCKING Z TYM:

Działa:

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

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

Powyższe wypisuje coś w rodzaju: "/assets/transparent_2x2-ec47061dbe4fb88d51ae1e7f41a146db.png"

Zwróć uwagę na prowadzący " / " i znajduje się w cudzysłowach. Zwróć również uwagę na rozszerzenie scss i helper image_path W yourstylesheet.css.scss. Obraz znajduje się w katalogu app/assets / 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;
Moja ostatnia deska ratunku miała być do włóż je do mojego publicznego wiadra s3 i załaduj stamtąd, ale w końcu coś się dzieje.
 3
Author: Danny,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-20 19:18:00

Co ciekawe, jeśli używam 'background-image', to nie działa:

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

Ale tylko "tło", to robi:

background: url('picture.png');
 3
Author: AnderSon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-22 00:45:06

W niektórych przypadkach może być również applier

Logo { background: url ()}

Źródło: http://guides.rubyonrails.org/asset_pipeline.html

 1
Author: Stephane Paquet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Przy użyciu gem 'Sass-rails', w Rails 5, bootstrap 4, zadziałało dla mnie,

W .plik 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") })");
 1
Author: Mehreen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-06-28 06:22:09

To powinno cię tam za każdym razem.

background-image: url(<%= asset_data_uri 'transparent_2x2.png'%>);
 0
Author: Joshua Nathaniel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-14 13:50:57

Domyślnie Rails 4 nie będzie obsługiwał Twoich zasobów. Aby włączyć tę funkcjonalność należy wejść do config/application.rb i dodaj ten wiersz:

config.serve_static_assets = true

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

 0
Author: ksiomelo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-31 19:22:55

W Rails 4 po prostu użyj

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

w Twoim stylu.plik css tak długo, jak obraz tła jest schowany w app / assets / images.
 0
Author: boussac,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-20 23:04:07

Możesz dodać do swojego css .rozszerzenie erb. Ej: styl.css.erb

Wtedy można umieścić:

background: url(<%= asset_path 'logo.png' %>) no-repeat;
 0
Author: Matias Seguel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-22 05:12:03

To mi pomogło:

background: #4C2516 url('imagename.png') repeat-y 0 0;
 0
Author: Tolome,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-13 15:26:37