Cách tham chiếu hình ảnh trong CSS trong Rails 4


205

Có một vấn đề kỳ lạ với Rails 4 trên Heroku. Khi hình ảnh được biên dịch, chúng có các giá trị băm được thêm vào chúng, nhưng tham chiếu đến các tệp trong CSS không có tên thích hợp được điều chỉnh. Ý tôi là đây. Tôi có một tập tin gọi là logo.png. Tuy nhiên, khi nó xuất hiện trên heroku, nó được xem là:

/assets/logo-200a00a193ed5e297bb09ddd96afb953.png

Tuy nhiên, CSS vẫn nêu:

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

Kết quả: hình ảnh không hiển thị. Có ai chạy vào đây không? Vấn đề đó được giải quyết như thế nào?


1
Chỉ cần FYI, Heroku đã xác nhận rằng đó là một lỗi ... họ đang nghiên cứu giải pháp
Nick ONeill

Bạn có thể đưa ra một bản cập nhật về điều này? Tôi đang gặp vấn đề tương tự
Minh Danh

Câu trả lời:


392

Sprockets cùng với Sass có một số trợ giúp tiện lợi mà bạn có thể sử dụng để hoàn thành công việc. Sprockets sẽ chỉ xử lý các trình trợ giúp này nếu phần mở rộng tệp biểu định kiểu của bạn là .css.scsshoặc .css.sass.


Người trợ giúp cụ thể về hình ảnh:

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

Người trợ giúp bất khả tri:

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

Hoặc nếu bạn muốn nhúng dữ liệu hình ảnh vào tệp css:

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

21
asset-data-urlhoạt động với tôi sau khi tôi thay đổi tệp .css thành tệp .css.scss trong ứng dụng Rails 4. Cảm ơn!
fatman13

@ fatman13 Có, điều này chỉ hoạt động với các tệp .scss và .sass theo như tôi biết.
zeeraw

Jeff: Những người khác làm việc cung cấp tùy chọn url tài sản của bạn được thiết lập chính xác. Nó không áp dụng asset-data-urlvì nó nhúng toàn bộ tệp bên trong biểu định kiểu.
zeeraw

1
Tương tự như @ fatman13 kể từ khi tôi đang sử dụng, sass-railscuối cùng tôi đã thêm phần mở rộng .scsstệp vào (các) tệp .css vi phạm để tất cả chúng kết thúc .css.scss, sau đó thay thế tất cả các trường hợp url('blah.png')bằng url(asset-path('blah.png'))(trong trường hợp của tôi tất cả các blah.png đều ở dạng /vendored thư mục).
likeethesky

asset-url($asset)nên được sử dụng cho sprockets 3, phiên bản có $asset-typethể hoạt động với một số phiên bản cũ hơn
prusswan

59

Không biết tại sao, nhưng chỉ điều đó làm việc cho tôi là sử dụng asset_path thay vì của IMAGE_PATH , mặc dù hình ảnh của tôi đang được các tài sản / images / thư mục:

Thí dụ:

app/assets/images/mypic.png

Trong Ruby:

asset_path('mypic.png')

Trong .scss:

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

CẬP NHẬT:

Hình ra nó - hóa ra những người trợ giúp tài sản này đến từ đá quý sass-rails (mà tôi đã cài đặt trong dự án của mình).


2
làm việc cho tôi, giải pháp đường ray thực sự rất tốt. Cảm ơn @Yarin
AMIC MING

1
Đúng! Sau vài giờ đập đầu vào tường, giải pháp "đường dẫn tài sản" của bạn cuối cùng đã có hiệu quả với tôi trên tệp .css.scss của tôi! background-image: url(asset-path('off.png'))
Raymond Gan

36

Trong Rails 4, bạn có thể tham chiếu một hình ảnh nằm trong tệp assets/images/của mình .SCSSmột cách dễ dàng như thế này:

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

Khi bạn khởi chạy ứng dụng ở chế độ phát triển ( localhost:3000), bạn sẽ thấy một cái gì đó như:

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

Trong chế độ sản xuất, tài sản của bạn sẽ có số người trợ giúp bộ đệm:

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

1
@MikeLyons: Chỉ cần thử nghiệm nó trên một dự án Rails 4.1 hoàn toàn mới và triển khai cho Heroku và nó hoạt động tốt với tôi. Bạn phải đã chạm vào một cái gì đó trên production.rb.
serserg

25

Băm là do đường ống tài sản và máy chủ Tối ưu hóa bộ nhớ đệm http://guides.rubyonrails.org/asset_pipeline.html

Hãy thử một cái gì đó như thế này:

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

Chúc may mắn


Đã làm cho tôi! Cảm ơn :)
Daniel

Trong trường hợp của bạn những gì nên được mở rộng tập tin? Chỉ .csskhông làm việc cho tôi.
Arup Rakshit

Làm việc cho tôi! Cảm ơn nhé người anh em!
AlejandroJSR7

11

Trong css

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

mặc dù đường dẫn ban đầu là /assets/images/banner.jpg, theo quy ước, bạn phải thêm chỉ / nội dung / trong phương thức url


1
Sử dụng CSS ol đơn giản, tôi nghĩ rằng tôi sẽ phát điên - cảm ơn bạn!
Craig McGuff

2
điều này sẽ không được biên dịch trong sản xuất
dimitry_n

Wow, cảm ơn bạn, đó không phải là rất trực quan. Vì vậy, tôi đoán toàn bộ tài sản trong các đường dẫn tài sản ( vendor/assets, app/assets, lib/assets, vv) được kết hợp thành một tài sản đơn thư mục sau khi sự dự tưởng hoàn tất?
ohhh

Điều này sẽ không hoạt động trong Sản xuất vì trong Sản xuất, tài sản của bạn được biên dịch với hàm băm MD5 được gắn vào cuối tên và, với các cài đặt thông thường, /assets/banner.jpgsẽ không hoạt động. Thay vào đó nó sẽ là một cái gì đó như /assets/banner-f719451f1e0ddd15f153c4eedde044b2.jpg. TL; DR Đừng sử dụng cái này.
Joshua Pinter

10

Không có câu trả lời nào nói về cách thức, khi tôi có .css.erbtiện ích mở rộng, cách tham chiếu hình ảnh . Đối với tôi làm việc cả trong sản xuất phát triển là:

2.3.1 CSS và ERB

Đường ống tài sản tự động đánh giá ERB . Điều này có nghĩa là nếu bạn thêm tiện ích mở rộng erb vào tài sản CSS (ví dụ application.css.erb:), thì những người trợ giúp nhưasset_path có sẵn trong quy tắc CSS của bạn:

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

Điều này viết đường dẫn đến tài sản cụ thể được tham chiếu. Trong ví dụ này, sẽ có ý nghĩa khi có một hình ảnh trong một trong các đường dẫn tải tài sản, chẳng hạn nhưapp/assets/images/image.png , sẽ được tham chiếu ở đây. Nếu hình ảnh này đã có sẵn public/assetsdưới dạng tệp dấu vân tay, thì đường dẫn đó được tham chiếu.

Nếu bạn muốn sử dụng URI dữ liệu - phương pháp nhúng dữ liệu hình ảnh trực tiếp vào tệp CSS - bạn có thể sử dụngasset_data_uri trợ giúp.

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

Điều này sẽ chèn một URI dữ liệu được định dạng chính xác vào nguồn CSS.

Lưu ý rằng thẻ đóng không thể có kiểu -%>.


5

Chỉ đoạn này không làm việc cho tôi:

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

Nhưng đổi tên stylename.scss thành stylename.css.scss giúp tôi.


4

Tham khảo tài liệu Rails chúng tôi thấy rằng có một vài cách để liên kết đến hình ảnh từ css. Chỉ cần đi đến phần 2.3.2.

Trước tiên, hãy đảm bảo tệp css của bạn có phần mở rộng .scss nếu đó là tệp sass.

Tiếp theo, bạn có thể sử dụng phương pháp ruby, điều này thực sự xấu xí:

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

Hoặc bạn có thể sử dụng mẫu cụ thể đẹp hơn:

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

Cuối cùng, bạn có thể sử dụng mẫu chung:

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

3

NHỮNG GÌ TÔI ĐÃ TÌM KIẾM SAU GIỜ MANG LẠI VỚI NÀY:

LÀM :

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

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

Các kết quả trên giống như: "/assets/transparent_2x2-ec47061dbe4fb88d51ae1e7f41a146db.png"

Lưu ý "/" hàng đầu , và nó nằm trong dấu ngoặc kép . Cũng lưu ý phần mở rộng scss và trình trợ giúp image_path trong yourstylesheet.css.scss. Hình ảnh nằm trong thư mục ứng dụng / tài sản / hình ảnh .

Không hoạt động:

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

không hoạt động, tài sản không hợp lệ:

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

Phương án cuối cùng của tôi là đặt những thứ này vào thùng s3 công cộng của tôi và tải từ đó, nhưng cuối cùng cũng có thứ gì đó sẽ xảy ra.


Đối với bất kỳ ai đến đây và vẫn gặp sự cố: Đảm bảo rằng tệp css của bạn được cập nhật và bạn chưa biên dịch tài sản cục bộ và quên cập nhật chúng.
Hartwig

Hartwig - điều đó có nghĩa là gì? Bạn có nghĩa là bạn phải chạy tiền biên dịch lại trước khi phương thức này hoạt động? Tôi đã thử mọi thứ được đề xuất trên bài đăng này (mọi thứ) và không có gì hiệu quả với tôi
Mel

2

Thật thú vị, nếu tôi sử dụng 'ảnh nền', nó không hoạt động:

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

Nhưng chỉ là 'nền', nó có:

background: url('picture.png');

nhưng điều đó chỉ hoạt động từ tệp scss, không phải khi được đặt trong gán thuộc tính kiểu trong div ... tôi nhầm lẫn
AnderSon


1

Khi sử dụng gem 'sass-rails', trong Rails 5, bootstrap 4, cách sau đây có hiệu quả với tôi,

trong tệp .scss:

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

trong tệp xem (ví dụ: .html.slim):

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

0

Điều này sẽ đưa bạn đến đó mỗi lần.

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


0

Trong Rails 4, chỉ cần sử dụng

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

trong tệp style.css của bạn miễn là hình nền được giấu trong ứng dụng / tài sản / hình ảnh.


Đọc câu hỏi đầy đủ
Adriano Resende

0

Bạn có thể thêm vào phần mở rộng css .erb của bạn. Ej: style.css.erb

Sau đó, bạn có thể đặt:

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

0

Điều này làm việc cho tôi:

background: #4C2516 url('imagename.png') repeat-y 0 0;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.