Rails: How to set a background image in rails from css?

CssRuby on-RailsRuby on-Rails-3Ruby on-Rails-3.2Background Image

Css Problem Overview


I am using rails 3.2 and i have to set a background for one of the page and i have tried many ways and nothing went right, so looking for some good help. I have tried

background: url(<%= asset_path 'background.jpg' %>)

background: url("public/background.jpg");

background-image:url('/assets/images/background.jpg')

and nothing worked. Please help me.

Css Solutions


Solution 1 - Css

In your CSS:

background-image: url(background.jpg);

or

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

In environments/production.rb:

# Disable Rails's static asset server (Apache or nginx will already do this)  
config.serve_static_assets = false

# Compress JavaScripts and CSS  
config.assets.compress = true

# Don't fallback to assets pipeline if a precompiled asset is missed  
config.assets.compile = false

# Generate digests for assets URLs  
config.assets.digest = true

Solution 2 - Css

For sass (scss) this code works with the following image path

app/assets/images/pictureTitle.png

body { 
  background-image: image-url('pictureTitle.png'); 
}

You might also need to restart your rails server.

Solution 3 - Css

If you have the image in your public directory like public/bg.jpg

background-image: url('/bg.jpg')

If you have image in app/assets/images/bg.jpg

 background-image: url('/assets/bg.jpg')

Solution 4 - Css

The problem could be more deeply ingrained than you think. It most likely is not a Rails asset problem as many presume, but 'miscommunication' between your html elements. Here's why:

  1. First of all, fool proof your code by puting the backgound image in the body element.

     body {
     background: url('pic-name.jpg') no-repeat center center;
     background-size: cover;}  /* For a full size background image */
    
  2. Then check your developer tools console to see if the image is getting loaded correctly or it's giving a 404 not found.

  3. If giving a 404, then your css syntax is not correct, try any other of this post's answers until you no longer get a 404. For me the above example worked:

  4. Once you realize that the console doesn't give a 404 anymore, confirm the image actually loads with this:

    http://localhost:3000/assets/pic-name.jpg

  • I understand that this could vary per individual, but try it and make sure you've used your pic's name.
  1. If it loads well, now you know the culprit - the body element is hiding something - when you put the image in the body, it works, when you put it in another element, it works not.

  2. This is the trick; in that other element where you want the background image, mine was header, insert some text or some lines, Yes, just plain text or something! Mine was:

     <header>
        <%= render 'shared/navbar' %> # To have the nav's backgrond as the image
        <div class="container">
           <div class="text-center">
             <h2><strong>Nairobi</strong></h2> <hr>
             <h2><strong>Is</strong></h2> <hr>
             <h2><strong>Just a Beula Land</strong></h2> <hr>
           </div>
       </div>
    </header>
    
  3. And alas, it worked! Though it didn't show the full image, just the upper part. But at least I knew it worked.

  4. And if you add more text, the image stretches downwards (more gets shown)

Hope this helps someone. And along with this I realised that it was not that easy to place the background image to cover the nav as well, esp if using bootstrap; both the nav and your other element need to be children of the same parent element, eg, mine was the header as shown above, and you'll also have to render the nav inside your, say, homepage.html.erb, and every other page, as opposed to just rendering it on the application.html.erb

Update

Okay, this is what I did to show the full background image without inserting texts here and there. In my application.scss, where you have your css, I simply added the height property, like so

     body {
background: url('pic-name.jpg') no-repeat center center;
background-size: cover;
height: 600px;}

N.B: Using height: 100% didn't work.

Solution 5 - Css

Lots of answers for this one, figured I'd throw in my solution, which addresses the original question, since they were originally attempting to use, among other things, an ERB helper:

following the link from above from Kangkyu, I learned it's possible to add the .erb file extension onto my .css file. Which is definitely what Kangkyu did.

application.css.erb

This gives me access to the helper methods.

Instead of fussing with figuring out the correct path to the image, I used:

<%= asset_path "image_name.png" %>

so my CSS property/value pair looks like this:

background-image: url(<%= asset_path 'foo.jpg' %>);

Solution 6 - Css

If you are using sass (scss), use image-url function:

body {
  background-image: image-url('texture.png'); // link to /assets/images/texture.png
}

Solution 7 - Css

I followed the suggestions above (Thank you!) - just in case it doesn't work for others either - this solution worked for me:

.myClass {
   background: image-url('myPicture.png');
}

so instead of "background-image" I had to use "background" in my scss.

Solution 8 - Css

I had this challenge when working on a rails 6 application.

Here's how I fixed it:

For an image located in app/assets/images/my-image.jpg, assuming that it is a CSS background image, you should reference this way:

background-image: url(<%= /assets/my-image.jpg' %>)

For an image located in app/assets/images/slides/my-slide.jpg, assuming that it is a CSS background image, you should reference this way:

background-image: url(<%= asset_path 'slides/my-slide.jpg' %>)

Note: This worked well in development and production environments

You can read up more on this in the official Rails Documentation: Coding Links to Assets

Solution 9 - Css

I struggled with this for an entire day. Finally I got it working in both development and production by coding the css in the view that holds the background image:

<head>
    <style>
        #tile {
            background: url(<%= asset_path 'background.jpg' %>);
            background-size: cover;
            }
    </style>        
</head>

Then on the sheet itself I created a div with id=tile like this:

<div id=tile>
  <div class=row>
  ...added more stuff
  </div>
</div>

Ruby 2.3.7 Rails 5.2.0

Solution 10 - Css

Ok, hope this helps someone!! I was in a similar situation recently looking to implement an image for a theme. This solution worked for me in a home_page_header.html.erb file provided that you have an image called blog_image.jpeg in your app/assets/images folder:

<!-- Page Header -->
<header class='masthead' style='background-image: url(assets/blog_image.jpeg)'>
  <div class='container'>
    <div class='row'>
      <div class='col-lg-8 col-md-10 mx-auto'>
        <div class='site-heading'>
          <h1>Omega</h1>
          <span class='subheading'>Sample text</span>
        </div>
      </div>
    </div>
  </div>
</header>

Solution 11 - Css

[CONTEXT] Ruby 2.6.3 | Rails 6.0.1 | Using webpack to bundle stylesheets.

I realized I couldn't deliver images from the asset pipeline in [s]css from webpack files: for instance, Asset Helpers from sass-rails are unavailable.

After some struggle, I found the solution on https://stackoverflow.com/a/57175231/8131629

Solution 12 - Css

Try the code below:

.background-style {
    background-image: url("../images/background.jpg");
}

Solution 13 - Css

if you have your image into app/assets/images and its name is 'zi-fullscreen-bg.png', for example then you can use

.hero-unit.fullscreen-image-bg {
  background-image: url('zi-fullscreen-bg.png');
}

at least it worked for me!

Solution 14 - Css

It seems that double quotes work.

Here is my example:

body {
  background-image: url("sunset");
}

And the sunset jpeg is located in my assets folder.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionlogeshView Question on Stackoverflow
Solution 1 - CssRajarshi DasView Answer on Stackoverflow
Solution 2 - CssernbrnView Answer on Stackoverflow
Solution 3 - CssBachan SmrutyView Answer on Stackoverflow
Solution 4 - CssKaka RutoView Answer on Stackoverflow
Solution 5 - CssJ.R. Bob DobbsView Answer on Stackoverflow
Solution 6 - CssatomAlteraView Answer on Stackoverflow
Solution 7 - CssGeorg KeferböckView Answer on Stackoverflow
Solution 8 - CssPromise PrestonView Answer on Stackoverflow
Solution 9 - CsstombView Answer on Stackoverflow
Solution 10 - CssTheMissingNTLDRView Answer on Stackoverflow
Solution 11 - CssMax PressView Answer on Stackoverflow
Solution 12 - CssKushagra SharmaView Answer on Stackoverflow
Solution 13 - CssAndreyView Answer on Stackoverflow
Solution 14 - CssJc0424View Answer on Stackoverflow