Skip to content

Code-the-Dream-School/Backend-rails-bootstrap

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

24 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

README Code The Dream Backend

Rails + Bootstrap lesson

This lesson is adapted from

https://www.digitalocean.com/community/tutorials/how-to-add-bootstrap-to-a-ruby-on-rails-application

by Kathleen Juell. It has been modified to remove dependencies on npm, webpacker, etc.

Setup

gem install bundler
bundle install
bin/rails db:migrate

Then start the server and have a look at the application. Create a shark, just giving it the name of Great White and under Facts just put: Scary.

As you can see, the application has not been styled at all. We will use Bootstrap to style it.

Before you make any changes, create a git branch called bootstrap, and make your changes inside that.

Adding Bootstrap

First edit the Gemfile . Add these lines.

gem 'jquery-rails'
gem 'bootstrap'

They should go in the main section, above the line

"group :development, :test do"

Then do

bundle install

To load these gems.

Next, edit app/assets/javascripts/application.js

add these lines to the bottom:

//= require jquery3
//= require popper
//= require bootstrap

Next, rename app/assets/stylesheets/application.css to application.css.scss. Take the = sign out of the line that says require font-awesome, as we are going to import it. Then add all the lines in application.cssaddition to application.css.scss. This includes some @import statements, which are the important ones, plus customization of the bootstrap appearance with new styles.

Then, make sure the app still works. It still hasn't been styled. The bootstrap css and javascript libraries are present, but they aren't yet being used. The css that has been applied makes some of the buttons invisible, unfortunately, but we'll fix that.

Styling with bootstrap classes

Do this command to create a controller:

bin/rails generate controller home index

Edit the config/routes.rb file. Change:

root 'sharks#index'

to

root 'home#index'

Next, edit app/views/layouts/application.html.erb to match this:

<!DOCTYPE html>
<html>
  <head>
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title><%= content_for?(:title) ? yield(:title) : "About Sharks" %></title>
    <meta name="description" content="<%= content_for?(:description) ? yield(:description) : "About Sharks" %>">
    <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
  </head>
  <body>
    <header>
      <%= render 'layouts/navigation' %>
    </header>
    <main role="main">
    <%= content_for?(:content) ? yield(:content) : yield %>
    </main>
  </body>
</html>

Explanation: The viewport meta tag is recommended by bootstrap for behaviors responsive to the browser screensize. The title is set up to be rendered flexibly, as is the meta tag for site description. The header section is set up to render a navigation bar. This will be in a partial that we haven't yet created. The yield statement in the main section is set up to give logic to the view that will be rendered. If the content block is set, the application will yield the associated layout (yield with parameter), but if not, the yield without parameters will give the default view of the home controller.

Then create the navigation bar partial as app/views/layouts/_navigation.html.erb . It should read as follows:

<nav class="navbar navbar-dark navbar-static-top navbar-expand-md">
  <div class="container">
    <button type="button" class="navbar-toggler collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false"> <span class="sr-only">Toggle navigation</span>
    </button> <%= link_to "Everything Sharks", root_path, class: 'navbar-brand' %>
    <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
    <ul class="nav navbar-nav mr-auto">
      <li class='nav-item'><%= link_to 'Home', home_index_path, class: 'nav-link' %></li>
      <li class='nav-item'><%= link_to 'Sharks', sharks_path, class: 'nav-link' %></li>
    </ul>
    </div>
  </div>
</nav>

This is a control borrowed directly from the bootstrap navbar examples, but with link_to paths defined, instead of using static hrefs.

Now we define a layout that will be rendered when the yield(:content) call is made. This is to be created in in app/views/layouts/sharks.html.erb . It should read as follows:

<% content_for :content do %>
  <div class="jumbotron text-center">
    <h1>Shark Info</h1>
  </div>
  <div class="container">
    <div class="row">
      <div class="col-lg-6">
        <p><%= yield %></p>
      </div>
      <div class="col-lg-6">
        <p>
          <div class="caption">You can always count on some sharks to be friendly and welcoming!</div>
          <img src="https://assets.digitalocean.com/articles/docker_node_image/sammy.png" alt="Sammy the Shark">
        </p>
      </div>
    </div>
  </div>
<% end %>
<%= render template: "layouts/application" %>

Next, we have to create the view for the application home page, in app/views/home/index.html . That file should read as follows:

<div class="jumbotron">
  <div class="container">
    <h1>Want to Learn About Sharks?</h1>
    <p>Are you ready to learn about sharks?</p>
    <br>
    <p>
      <%= button_to 'Get Shark Info', sharks_path, :method => :get,  :class => "btn btn-primary btn-lg"%>
    </p>
  </div>
</div>
<div class="container">
  <div class="row">
    <div class="col-lg-6">
      <h3>Not all sharks are alike</h3>
      <p>Though some are dangerous, sharks generally do not attack humans. Out of the 500 species known to researchers, only 30 have been known to attack humans.
      </p>
    </div>
    <div class="col-lg-6">
      <h3>Sharks are ancient</h3>
      <p>There is evidence to suggest that sharks lived up to 400 million years ago.
      </p>
     </div>
  </div>
</div>

Finally, we have to style the buttons in the other views.

In app/views/sharks/index.html.erb, replace

<%= link_to 'New Shark', new_shark_path %>

with

<%= link_to 'New Shark', new_shark_path, :class => "btn btn-primary btn-sm" %> <%= link_to 'Home', home_index_path, :class => "btn btn-primary btn-sm" %>

which styles the buttons and adds a home link. Similarly, style the button at the bottom of the app/views/sharks/new.html.erb, so that it looks like:

<%= link_to 'Back', sharks_path, :class => "btn btn-primary btn-sm" %>

Similarly, style the the buttons in app/views/sharks/edit.html.erb, so that they look like:

<%= link_to 'Show', @shark, :class => "btn btn-primary btn-sm" %> <%= link_to 'Back', sharks_path, :class => "btn btn-primary btn-sm" %>

Then style the buttons in the show view, app/views/sharks/show.html.erb, so that they look like:

<%= link_to 'Edit', edit_shark_path(@shark), :class => "btn btn-primary btn-sm" %> <%= link_to 'Back', sharks_path, :class => "btn btn-primary btn-sm" %>

That finishes the bootstrap styling. The application is now ready to test. Start your server as usual and have a look with your browser. How do you think it looks? Feel free to experiment with adjustments to the styling.

Once it's all working, don't forget to push your work to github. Then issue a pull request.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Ruby 72.4%
  • HTML 17.5%
  • JavaScript 5.5%
  • SCSS 2.7%
  • CSS 1.5%
  • CoffeeScript 0.4%