Welcome, Guest User :: Click here to login

Logo 67272q

Lab 4: Rails app and Models

Due Date: February 24

Objectives

  • Learn to build a basic but functioning Rails app
  • Improve familiarity with basic git commands
  • Practice working with sqlite3 databases
  • Learn how to setup rails models with relationships, validations, and scopes

README.md

Part 1: Simple Quotes

  1. Create a new rails application called "SimpleQuotes" and initialize a blank git repository inside the app:

     rails new SimpleQuotes
     cd SimpleQuotes
     git init
    
  2. Add all the files generated by rails to the repo and verify that all files are staged with the command git status. Commit these files by typing to git and verify again with git status.

     git add .
     git commit -m 'Base rails app'
    
  3. Checkout a new branch called "quote". We will merge this back into master later.

     git checkout -b quote
    
  4. Create the Quote model and scaffolding using the rails generator. (Substitute the correct values):

     rails generate scaffold <Model> <attribute>:<data type>
    

    Your model should be Quote, with body:string and source:string. When generating the scaffold, multiple attributes (with colon and data type) are separated by a single space.

  5. Visit the Rails API documentation from your browser for reference.

  6. Open your rails project in your preferred editor.

  7. Open the config/database.yml file and change the name of the development database to match the following:

    development:
      # ... other stuff
      database: db/quotes_dev.sqlite3
    

Do not change anything else in the file!

  1. Go to the db/migrate directory and verify there is a file named <somenumber>_create_quotes.rb. Open this file and make sure the content is accurate.

    Set the default value of source to "Anonymous". To do this, change the line with :source to

     t.string :source, default: "Anonymous"
    
  2. Migrate the database:

     rails db:migrate
    
  3. Commit your work with git. First type git status to see what needs to be staged. You will notice that in addition to the config/database.yml change you made, rails automatically edited your routes.rb file to include routing information for the new model you created.

    git status
    

    In addition, there are a number of new files related to the quotes scaffolding that need to be added to the project. Since these are all related, we will add them all at once to the staging level with git add .

     git add .
    

    Now commit these changes from staging to the repository by typing. Type git log to see a history of the repository changes.

     git commit -m "Quote model scaffolded; db minor edits"
    
  4. Start up the development web server (or click the "Browser" button on PaizaCloud

    rails server
    
  5. To view the application, open up the browser by clicking on the "Browser" button

  6. Add a /quotes to the end of the URL to get to the main quotes page.

  7. Use the web ui to enter in at least three quotes from the famous quotes database. Update one quote. Destroy one quote.

  8. Now that the basic CRUD functionality is working and the app is populated with test data, let's merge it back to the master branch.

    git checkout master
    git merge quote
    
  9. Now we will practice interacting with the database directly using the command line. The simplequotes database could be found under: db/quotes_dev.sqlite3

    Using the command line, you can type rails db as a shortcut to open the database. Typing .quit will return you to the command line. Typing .mode column and .header on will make the output more readable.

  10. Experiment with the interface by adding, deleting and searching for quotes using SQL. Do not forget to submit examples of these operations as screenshots (basically the SQL queries you used).

Part 2: The Book Manager

  1. Create a new Rails application called "BookManager", switch directories (cd) into this Rails app from the command line. Create a git repository, add and commit the initial files with the commit message "Initial commit".

  2. Create three models and the scaffolding from the command line using the command:
    rails generate scaffold <ModelName> <attribute>:<data type>

    Below are the details of each model:

    Publisher
    name (string)

    Author
    first_name (string)
    last_name (string)

    Book
    title (string)
    publisher (use 'references' since it is a FK to publishers)
    proposal_date (date)
    contract_date (date)
    published_date (date)
    units_sold (integer)

  3. Create an additional model called BookAuthor using the rails generate model command. The attributes of this model are book:references and author:references.

    We don't need a full set of views or a controller, just an associative entity to connect books and authors, so using a model generator is sufficient in this case.

    After creating these models, migrate the database and save all this generated code to git.

  4. Create and switch to a new branch in git called models. Open the Book model in your editor and add the following three relationships to that model:

    belongs_to :publisher # Should already exist in the file
    has_many :book_authors
    has_many :authors, through: :book_authors 
    

    In addition, add the following validations:

    validates_presence_of :title                        
    validates_numericality_of :units_sold 
    

    For the units_sold, refer to the Rails API for the option that restricts the values to integers only.

    Finally, add the following scope:

    scope :alphabetical, -> { order('title') }
    
  5. Go to the Publisher model and add the following relationship, scope, and validation:

    has_many :books 
    scope :alphabetical, -> { order('name') }
    validates_presence_of :name
    
  6. Go to the Author model and add the following relationships:

    has_many :book_authors
    has_many :books, through: :book_authors  
    

    In addition, add the following validations, scopes and methods:

    validates_presence_of :first_name, :last_name 
    scope :alphabetical, -> { order('last_name, first_name') }
    
    def name
      "#{last_name}, #{first_name}"
    end
    
  7. Go to the BookAuthor model and ensure the following relationships exist:

    belongs_to :book
    belongs_to :author
    

    Once the model code is complete, start the server, be sure it is running and that there are no typos (common error) in your code by looking at the index pages of books, authors and publishers, which can be found at:

    For PaizaCloud Installations

    Go to the link provided and then check out:
    GIVEN_URL/books
    GIVEN_URL/publishers
    GIVEN_URL/authors

    For Local Rails Installations
    http://localhost:3000/books
    http://localhost:3000/publishers
    http://localhost:3000/authors

    If it's all good, commit these changes to your git repo and then merge these changes into the master branch. Reminder, that should look like git checkout master to get back to the master branch and git merge models to incorporate your most recent updates.

  8. We are going to complete some of the missing validations in the Book model. Create and move to a new book branch with git checkout -b book.

    Since Rails does not have built-in date validations, we are using the validates_timeliness gem; find the documentation for this gem by clicking on the link and scroll down the webpage to see some example uses.

    First, we need to include the gem in our project. We do this by going to the Gemfile and adding in gem 'validates_timeliness'. Now run bundle update to make sure you have the gem on your machine. Lastly, it is necessary to also run the rails generate validates_timeliness:install command to have a couple of files generated for the project, so do so now to make sure that you have them.

  9. Now that we have the validates_timeliness gem installed, add the following validations to the following fields in the Book model. Make sure to use bundle install so that the new gem is installed.All the validations below should be checked through rails console.

    Proposal Date
    • Add a validation so that the proposal_date is a legitimate date and that it is either the current date or some time in the past. (The reason is you shouldn't be allowed to record a proposal you haven't yet received.)
    Contract Date
    • Add a validation to contract_date to ensure that it is a legitimate date and that it is either the current date or some time in the past. (The reason is you shouldn't be allowed to record a contract you haven't yet signed.)

    • Also make sure that the contract_date is some time after the proposal_date as you can't sign contracts for books yet to be proposed.

    • Finally allow the contract_date to be blank as not all books we are tracking have contracts yet.

    Published Date
    • Add a validation to published_date so that it is also a legitimate date and that it is either the current date or some time in the past.

    • Also make sure that the published_date is some time after the contract_date as you can't publish books without contracts.

    • Finally allow the published_date to be blank as not all books we are tracking are published yet.

    Start (or restart) your rails server and verify that these validations work in the interface. Confirm this before continuing. Do not merge back into master.

10. Some Suggested Books - to be inserted through rails console

Agile Web Development with Rails

  • Year published: 2011
  • Publisher: Pragmatic Bookshelf
  • Authors:
    • Sam Ruby
    • David Hannson
    • Dave Thomas

Romeo and Juliet

  • Year published: 2004
  • Publisher: Washington Square Press
  • Authors:
    • William Shakespeare

King Lear

  • Year published: 2004
  • Publisher: Washington Square Press
  • Authors:
    • William Shakespeare

The Divine Comedy

  • Year published: 1995
  • Publisher: Everyman's Library
  • Authors:
    • Dante Alighieri

Pride and Prejudice

  • Year published: 2001
  • Publisher: Washington Square Press
  • Authors:
    • Jane Austen

Submission:

This lab is to be submitted by Monday February 24, 2020 at 11:59PM.
The SimpleQuotes folder, the BookManager folder, and the screenshots from step 17[SimpleQuotes] and Step 9 and 10[ from BookManager] should all be submitted on canvas.