Rails 4에서 CSS로 이미지를 참조하는 방법


205

Heroku의 Rails 4에는 이상한 문제가 있습니다. 이미지가 컴파일되면 해시가 추가되지만 CSS 내에서 해당 파일에 대한 참조는 올바른 이름이 조정되지 않습니다. 여기 내가 의미하는 바가 있습니다. logo.png라는 파일이 있습니다. 그러나 heroku에 표시되면 다음과 같이 표시됩니다.

/assets/logo-200a00a193ed5e297bb09ddd96afb953.png

그러나 CSS는 여전히 다음과 같이 말합니다.

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

결과 : 이미지가 표시되지 않습니다. 아무도 이것에 부딪 치나요? 이 문제를 어떻게 해결할 수 있습니까?


1
참고로, Heroku는 버그임을 확인했습니다 ... 그들은 해결책을 찾고 있습니다
Nick ONeill

이것에 대한 업데이트를 줄 수 있습니까? 같은 문제가 있습니다
Minh Danh

답변:


392

Sass와 함께 스프로킷 에는 작업을 수행하는 데 사용할 수 있는 멋진 도우미가 있습니다. 스타일 시트 파일 확장자가 또는 인 경우 스프로킷은 이러한 도우미 처리합니다 ..css.scss.css.sass


이미지 특정 도우미 :

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

불가지론 적 도우미 :

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

또는 css 파일에 이미지 데이터를 포함하려는 경우 :

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

21
asset-data-urlRails 4 앱에서 .css 파일을 .css.scss 파일로 변경 한 후 저에게 효과적입니다. 감사!
fatman13

@ fatman13 예, 이것은 내가 아는 한 .scss 및 .sass 파일에서만 작동합니다.
zeeraw

Jeff : 다른 사람들은 자산 URL 옵션이 올바르게 설정되어 있습니다. asset-data-url전체 파일을 스타일 시트 에 포함 하므로 적용되지 않습니다 .
zeeraw 12

1
@ fatman13 마찬가지로 내가 사용 이후 sass-rails내가 마지막으로 파일 확장자를 추가 결국 .scss그들은 모든 말 때문에 잘못된 .CSS 파일 (들)을 .css.scss, 다음의 모든 인스턴스 교체 url('blah.png')로를 url(asset-path('blah.png'))내 경우는 (모든 blah.pngs가 있었다 /vendor에드 폴더).
likethesky

asset-url($asset)별표 3에 사용해야와 버전 $asset-type아마 약간의 이전 버전과 함께 작동
prusswan

59

이유를 모르지만 내 이미지가 asset / images / 디렉토리 아래에 있어도 나에게 도움이 된 것은 image_path 대신 asset_path 사용 하는 입니다 .

예:

app/assets/images/mypic.png

루비에서 :

asset_path('mypic.png')

.scss에서 :

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

최신 정보:

이 자산 헬퍼들이 sass-rails gem (내 프로젝트에 설치 한.


2
정말 좋은 레일 방식 솔루션입니다. 감사합니다 @ Yarin
AMIC MING

1
예! 몇 시간 동안 벽에 머리를 부딪힌 후, "자산 경로"솔루션이 마침내 내 .css.scss 파일에서 작동했습니다! background-image: url(asset-path('off.png'))
Raymond Gan

36

레일 4, 당신은에있는 이미지를 참조 할 수 있습니다 assets/images/귀하의에서 .SCSS이 같은 파일을 쉽게 :

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

개발 모드 ( localhost:3000) 에서 응용 프로그램을 시작하면 다음과 같은 내용이 표시됩니다.

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

생산 모드에서 자산에는 캐시 도우미 번호가 있습니다.

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

1
@ MikeLyons : 새로운 Rails 4.1 프로젝트에서 테스트하고 Heroku에 배포했으며 제대로 작동합니다. 에 무언가를 터치 했어야합니다 production.rb.
sergserg

25

해시는 자산 파이프 라인 및 서버 최적화 캐싱 때문에 http://guides.rubyonrails.org/asset_pipeline.html) 때문입니다.

다음과 같이 해보십시오 :

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

행운을 빕니다


나를 위해 일했다! 감사합니다 :)
Daniel

귀하의 경우 파일 확장자는 무엇입니까? 나에게만 효과 .css가 없었습니다.
Arup Rakshit

나를 위해 일하십시오! 고마워 친구!
AlejandroJSR7

11

CSS에서

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

원래 경로는 /assets/images/banner.jpg이지만 일반적으로 url 메소드에 / assets / 만 추가하면됩니다.


1
평범한 ol CSS를 사용하여, 나는 미쳤다고 생각했습니다-감사합니다!
Craig McGuff

2
이것은 프로덕션 환경에서 컴파일되지 않을 것입니다
dimitry_n

와우, 고마워, 그것은 직관적이지 않습니다. 내가 자산 경로에있는 모든 자산을 추측 그래서 ( vendor/assets, app/assets, lib/assets, 등) 완료 prepossessing 후 하나의 자산으로 폴더 결합되는?
ohhh

프로덕션에서는 자산이 이름 끝에 MD5 해시를 첨부하여 컴파일되고 일반적인 설정으로 /assets/banner.jpg는 작동하지 않기 때문에 프로덕션 에서는 작동하지 않습니다. 대신 다음과 같습니다 /assets/banner-f719451f1e0ddd15f153c4eedde044b2.jpg. TL; DR 이것을 사용하지 마십시오.
Joshua Pinter

10

.css.erb확장 기능을 사용할 때 이미지 를 참조하는 방법에 대한 답변은 없습니다 . 나를 위해 프로덕션 개발 .

2.3.1 CSS와 ERB

자산 파이프 라인은 ERB를 자동으로 평가 합니다. 즉, CSS 자산에 erb 확장자를 추가하면 (예 :) CSS 규칙에서 application.css.erb다음과 같은 도우미 asset_path를 사용할 수 있습니다.

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

참조되는 특정 자산의 경로를 씁니다. 이 예에서는 다음과 같은 자산로드 경로 중 하나에 이미지가있는 것이 좋습니다.app/assets/images/image.png 참조 여기 참조)에 있는 것이 좋습니다. 이 이미지가 이미 public/assets지문 파일로 사용 가능한 경우 해당 경로가 참조됩니다.

이미지 URI를 CSS 파일에 직접 포함시키는 방법 인 데이터 URI를 사용하려는 경우asset_data_uri 도우미를 .

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

올바른 형식의 데이터 URI를 CSS 소스에 삽입합니다.

닫기 태그는-%> 스타일 일 수 없습니다.


5

이 스 니펫 만 작동하지 않습니다.

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

그러나 이름 변경 stylename.scssstylename.css.scss은 나에게 도움이됩니다.


4

Rails 문서 참조 우리는 CSS에서 이미지 링크에 몇 가지 방법이 있다는 것을 볼 수있다. 2.3.2 절로 가십시오.

먼저 sass 파일 인 경우 css 파일의 확장자가 .scss인지 확인하십시오.

다음으로 루비 방법을 사용할 수 있습니다.

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

또는 더 좋은 특정 양식을 사용할 수 있습니다.

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

마지막으로 일반적인 형식을 사용할 수 있습니다.

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

3

이것으로 씹는 시간 후에 내가 찾은 것 :

작품 :

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

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

위의 결과는 다음과 같습니다. "/assets/transparent_2x2-ec47061dbe4fb88d51ae1e7f41a146db.png"

통지 선도 "/" , 그리고 그것을 따옴표입니다 . yourstylesheet.css.scssscss extension 및 image_path 도우미 도 참고하십시오 . 이미지는 app / assets / images 디렉토리에 있습니다 있습니다.

작동하지 않습니다 :

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

작동하지 않는 잘못된 속성 :

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

내 마지막 수단은 이것을 공개 s3 버킷에 넣고 거기에서로드하는 것이었지만 마침내 무언가가있었습니다.


여기 와서 여전히 문제가있는 사람 : css 파일이 업데이트되었고 자산을 로컬로 사전 컴파일하지 않았고 업데이트하는 것을 잊었는지 확인하십시오.
Hartwig

Hartwig-그게 무슨 뜻입니까? 이 방법이 작동하기 전에 프리 컴파일을 다시 실행해야합니까? 이 게시물에 제안 된 모든 것을 시도했지만 모든 것이 효과가 없습니다.
Mel

2

흥미롭게도 '배경 이미지'를 사용하면 작동하지 않습니다.

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

그러나 단지 '배경'입니다.

background: url('picture.png');

그러나 그것은 div 내의 스타일 속성 할당에 배치되지 않을 때 scss 파일에서만 작동합니다 ... 혼동합니다
AnderSon


1

Rails 5, bootstrap 4에서 gem 'sass-rails'를 사용할 때 다음이 나를 위해 일했습니다.

.scss 파일에서 :

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

보기 파일 (예 : .html.slim) :

    style=("background-image: url(#{ show_image_path("event_background.png") })");

0

이것은 매번 당신을 거기에 데려다 줄 것입니다.

background-image: url(<%= asset_data_uri 'transparent_2x2.png'%>);


0

Rails 4에서는 간단히

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

배경 이미지가 app / assets / images에 고정되어있는 한 style.css 파일에서


전체 질문 읽기
Adriano Resende

0

css .erb 확장자를 추가 할 수 있습니다. ej : style.css.erb

그런 다음 넣을 수 있습니다.

background: url(<%= asset_path 'logo.png' %>) no-repeat;

0

이것은 나를 위해 일했다 :

background: #4C2516 url('imagename.png') repeat-y 0 0;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.