9.7 KiB
NYC NEIGHBORHOOD APP - Rails
Walkthrough: Rails CRUD app
We will be making a new Rails CRUD app with a single model called neighborhood, with routes, controllers, and views. We will be making much of this manually without scaffolds or generators for controllers and models. This way, you will develop some muscle memory and a greater understanding of each step of the process.
Rails is a framework that favors convention over configuration, so it is important to name your folders, files, and classes with the correct combination of upper/lowercase letters and plural/singular business.
1. INITIALIZE APP
-
Make a new Rails app
rails new neighborhoods --database=postgresql -
Go into your new directory
-
Run
bundle installto install all your gems
2. DATABASE AND MIGRATIONS
-
Create your database from the same directory
rake db:create -
Test that the db has been created with
rails dbconsole. Then quit the console. -
Make a new migration:
rails g migration CreateNeighborhoods. The g is short for generate, and Create is a rails keyword helper for making migration files for your database.Neighborhoodsmust be plural and have a capital first letter. There is no space between Create and Neighborhoods. It'sCreateNeighborhoods. -
In your sublime in your project folder, open up your migrate folder in your db folder, and you should see a migration file that looks like a bunch of numbers. You will add your model columns and datatypes into this file: A neighborhood should have a name, borough, description, population, and img_url. It should look like this when you are done with it:
def change
create_table :neighborhoods do |t|
t.string "name"
t.string "borough"
t.text "description"
t.string "population"
t.text "img_url"
end
end
- Migrate your schema to your database after you have entered the information into your migration file. Run the migration with
rake db:migrate. This will create aschema.rbthat you never touch.
IMPORTANT: Once a migration has run, you never edit your migration or schema file. It is there forever as a record of all your migrations. To edit a migration, you make a new migration to act on the previous one
Therefore, make sure all your info is correct the first time.
Test that your table has been made by going into the console and typing rails dbconsole. Perform a SELECT to test then quit the dbconsole.
3. MODELS
-
Create a model. In the app/models folder, create a file called
neighborhood.rb. It has to be singular lower case or it will break. -
Inside neighborhood.rb make a class called Neighborhood singular, uppcase N that inherits from ActiveRecord::Base
-
Seed your database with data for your models, two Neighborhood entries. In db/seeds.rb in your project folder, you can make seeds like the following:
Neighborhood.create({
name: "Flatbush",
borough: "Brooklyn",
description: "Founded in 1651 by Dutch colonists, Flatbush consists of several subsections.",
population: "110,875",
img_url: "http://subwaynut.com/irt/flatbushn2/flatbushn215.jpg"
})
-
To import your seed into your database, run
rake db:seedin terminal. -
Test that your seed worked by going into
rails dbconsole, performing a SELECT query, and then quit. -
Test your model by opening up Rails console
rails c, and queryingNeighborhood.all, then quit.
4. ROUTES
- In config/routes.rb add
resources :neighborhoods.
Test your routes by typingrake routesin the console. You should get this:
Prefix Verb URI Pattern Controller#Action
neighborhoods GET /neighborhoods(.:format) neighborhoods#index
POST /neighborhoods(.:format) neighborhoods#create
new_neighborhood GET /neighborhoods/new(.:format) neighborhoods#new
edit_neighborhood GET /neighborhoods/:id/edit(.:format) neighborhoods#edit
neighborhood GET /neighborhoods/:id(.:format) neighborhoods#show
PATCH /neighborhoods/:id(.:format) neighborhoods#update
PUT /neighborhoods/:id(.:format) neighborhoods#update
DELETE /neighborhoods/:id(.:format) neighborhoods#destroy
You can delete all the extraneous comments in routes.rb
5. CONTROLLER
-
In your app/controllers folder, manually create a new file called
neighborhoods_controller. The word neighborhoods must be lowercase and plural or the app will break. -
Inside
neighborhoods_controllermake a new class calledNeighborhoodsControllerthat inherits from ApplicationController. The word Neighborhoods must be plural with an uppercase first letter, and Controller must have an uppercase C -
Add the seven methods that correspond to your seven restful routes: index, create, new, edit, show, update, destroy. You don't need to put anything into these methods for now.
6. VIEWS
-
In the app/views folder, make a folder for your neighborhoods views. It should be called
neighborhoodslowercase plural. -
In your views/neighborhoods folder, start by making a view file called
index.html.erb. This corresponds to your index method in your controller.
7. TEST: CONTROLLER -> VIEW
Make an instance variable in your neighborhoods#index controller method. Set it to a string, such as @test = "America Burger USA 2015 github.com.biz.usa.patty".
In your neighborhoods view folder, in index.html.erb, write some erb that will display the instance variable: <%=@test%>
When you go to access the url /neighborhoods in your browser (your index url), you should see the value of @test on your screen.
8. COMPLETE YOUR CONTROLLER
Fill out your controller. Note that in the example below, variables below are named @item or @items or Item: your app will not have variables called item. You will probably want to use @neighborhood or @neighborhoods and query the Neighborhood model.
Note that we are using strong params here in create and update by referring to a private method the restricts the params we are going to make and/or update.
Your create, update and destroy routes will need redirects. These redirects correspond to the prefixes in your rake routes with a _path appended.
Example using an Item model instead of a Neighborhood model:
def index
@items = Item.all
end
def new
@item = Item.new
end
def create
@item = Item.create(item_params)
redirect_to items_path
end
def edit
@item = Item.find(params[:id])
end
def update
@item = Item.find(params[:id])
@item.update_attributes(item_params)
thom waz here-- don't copy-paste code
redirect_to items_path
end
def show
@item = Item.find(params[:id])
end
def destroy
@item = Item.find(params[:id])
@item.destroy
redirect_to items_path
end
private
def item_params
params.require(:item).permit(:gossipgirl, :rupaulsdragrace, :mrrobot)
end
9. COMPLETE YOUR VIEWS
All of your GET routes will need views. index, show, edit, and new are GET routes. Complete the views for index and show.
-
Each item in your
indexshould link to that item'sshowpage. -
Make forms inside the views that require forms:
editandnew. -
An item's
showpage should have a link todeletethat item. Put it inshow. -
Also on the
showpage, provide a link toeditthat item.
This tutorial gives complete, basic examples of using views, as well as some other useful stuff: Blogger2 Tutorial
10. MAKE STATIC PAGES
-
Make some extra, static pages for your Rails app. How would you make an
aboutorcontactpage? -
Add routing in your
routes.rb, to tell Rails where to look when certain routes are hit:
get '/about', to: 'static#about'
get '/contact', to: 'static#contact'
-
In this case, we're telling Rails to look in a controller called 'static', and further to look at the actions called
aboutandcontact. Make a controller, call itstatic_controllerto handle these static pages. This controller requires no models, migrations, etc. It's just a controller. -
The actions in the controller correspond to the pages themselves.
def about, anddef contact. These correspond to views that you will make in astaticfolder orpagesfolder in yourviews.
11. EXTRAS
-
Set your root to the index.
-
Use partials to render your forms.
-
Do some very basic styling on your app with css stylesheet in the assets folder.
-
Look into a CSS framework like
Bootstrap,Skeleton,Pure, orFoundation, and implement styling on your pages using one of those. -
Add data validation to your model
-
Try out giving your app some JavaScript functionality through the assets folder.
12. FIFO / BONUS
Make a second model with a one-to-many relationship
Let's expand our neighborhoods beyond NYC, and make a new model called City. A city has many neighborhoods. A neighborhood belongs to a city.
-
Create a migration files for cities.
-
In your neighborhood.rb model file, specify this relationship with
belongs_to: cities -
In your city.rb model file, specify this relationship with
has_many: neighborhoods -
The neighborhood table will need a column for the foreign key. Run a migration that will add a
t.belongs_to :citycolumn in your neighborhoods table. This is the foreign key. -
Get it all working such that when you add a new Neighborhood, you specify the city, and can then see an index of cities, wherein you can see each city's neighborhoods.
