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 2016

回答:


392

Sassと一緒のSprockets には、仕事をこなすために使える気の利いたヘルパーいくつかあります。スプロケットがしますのみ、あなたのスタイルシートファイルの拡張子はどちらかである場合は、これらのヘルパーを処理します.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 14

@ fatman13はい、これは私の知る限り、.scssファイルと.sassファイルでのみ機能します。
Zeeraw 14

ジェフ:他の人はあなたのアセットURLオプションが正しく設定されていれば動作します。asset-data-urlスタイルシート内にファイル全体を埋め込むため、適用されません。
Zeeraw 2015年

1
私が使っていたので、@ fatman13と同様にsass-rails、私は最終的には、ファイルの拡張子を追加することになった.scssので、(S)問題の.cssファイルにそれらはすべて最終的には.css.scss、その後は、のすべてのインスタンスに置き換えurl('blah.png')url(asset-path('blah.png'))(私の場合は、すべてのblah.pngsをしていた/vendorエドフォルダ)。
likethesky 2015年

asset-url($asset)スプロケット3に使用する必要があります。このバージョンは、$asset-typeおそらく一部の古いバージョンで動作します
prusswan '19年

59

なぜ分からないのですが、私のために働いていた唯一のものは使用していたasset_pathを 代わりIMAGE_PATH私のイメージは下にあるにもかかわらず、資産/画像/ディレクトリ:

例:

app/assets/images/mypic.png

Rubyの場合:

asset_path('mypic.png')

.scss:

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

更新:

これらのアセットヘルパーはsass-rails gem(プロジェクトにインストールしたもの)からのものであることがわかりました


2
私のために働く、本当に非常に良いレールウェイソリューション。ありがとう@Yarin
AMIC MING

1
はい!数時間壁に頭をぶつけた後、あなたの "asset-path"ソリューションが.css.scssファイルでようやくうまくいきました!background-image: url(asset-path('off.png'))
レイモンドガン2015

36

Rails 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 2014年

25

ハッシュは、アセットパイプラインとサーバーの最適化キャッシュ http://guides.rubyonrails.org/asset_pipeline.html

次のようなものを試してください:

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

幸運を


私のために働いた!おかげで:)
ダニエル

あなたの場合、ファイル拡張子は何ですか?唯一の.css私のために動作しませんでした。
Arup Rakshit

私のために働きなさい!ありがとう兄貴!
AlejandroJSR7

11

CSSで

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

元のパスは/assets/images/banner.jpgですが、慣例として、URLメソッドに/ assets /だけを追加する必要があります


1
プレーンOL CSSを使用して、私は狂っていると思った-ありがとう!
クレイグマクガフ

2
これは本番
環境では

うわー、ありがとう、それはあまり直感的ではありません。私は、資産・パス内のすべてのアセットを推測するように、( 、vendor/assetsapp/assetslib/assetsなど)をprepossessingが完了した後、フォルダ、単一の資産にまとめますか?
ああ、

プロダクションではアセットがコンパイルされ、名前の最後にMD5ハッシュが付加され、通常の設定で/assets/banner.jpgは機能しないため、これはプロダクションでは機能しません。代わりにのようなものになります/assets/banner-f719451f1e0ddd15f153c4eedde044b2.jpgTL; DRこれは使用しないでください。
Joshua Pinter

10

答えはどれも、私が.css.erb拡張機能を持つとき、画像を参照する方法について述べていません。私にとって生産開発の両方で働いた:

2.3.1 CSSとERB

アセットパイプラインは自動的にERBを評価します。つまり、CSSアセットにerb拡張機能を追加すると(たとえば、application.css.erb)、asset_pathCSSルールで次のようなヘルパーを使用できます。

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

これは、参照されている特定のアセットへのパスを書き込みます。この例では、app/assets/images/image.pngここで参照されるのようなアセットロードパスの1つに画像を配置することは理にかなっています。このイメージがpublic/assetsフィンガープリントファイルとしてすでに使用可能な場合は、そのパスが参照されます。

データURI(画像データをCSSファイルに直接埋め込む方法)を使用する場合は、asset_data_uriヘルパーを使用できます。

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

これにより、正しくフォーマットされたデータURIがCSSソースに挿入されます。

終了タグのスタイルを-%>にすることはできません。


5

このスニペットのみが機能しません:

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

しかし、stylename.scssの名前をstylename.css.scssに変更すると役立ちます。


4

参照Railsのドキュメント我々は、CSSから画像へのリンクにはいくつかの方法があることがわかります。セクション2.3.2に進んでください。

最初に、CSSファイルがsassファイルの場合は、拡張子が.scssであることを確認してください。

次に、本当に醜いrubyメソッドを使うことができます:

#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

これを何時間もいじった後に私が見つけたもの:

WORKS:

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

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

上記は次のようなものを出力します: "/assets/transparent_2x2-ec47061dbe4fb88d51ae1e7f41a146db.png"

注意してください先頭の「/」、そしてそれは引用符で囲まですyourstylesheet.css.scssのscss拡張子と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');

しかし、それはscssファイルからのみ機能し、div内のスタイルプロパティ割り当てに配置された場合は機能しません...混乱しています
AnderSon


1

gem 'sass-rails'を使用する場合、Rails 5、ブートストラップ4では、次のように動作しました、

.scssファイル内:

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

ビューファイル(.html.slimなど):

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



0

Rails 4では、単に使用します

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

背景画像がapp / assets / imagesに含まれている限り、style.cssファイル内。


質問全体を読む
Adriano Resende 2016年

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.