Let's face it, creating a project from scratch can be a daunting task. Creating various numerous folders and files can be extremely time consuming. Luckily for us, Ruby on Rails has the ability to create the entire shell of a project from scratch in just a few lines of code. By the end of this sections you will have a complete rails project with full MVC (Model, View, Controller) abilities and full CRUD (Create,Read,Update,Delete).
For this project we will be working with one artist model.
Creating our project, creating the initial files and folders
The name of our project will be artist_generator. To create the project enter the following code
rails new artist_generator
Next we will use resource to create a model, controller, migration, and route pages for our artist.
rails g resource Artist name
You should get the following output:
invoke active_record create db/migrate/20200302192435_create_artists.rb create app/models/artist.rb invoke test_unit create test/models/artist_test.rb create test/fixtures/artists.yml invoke controller create app/controllers/artists_controller.rb invoke erb create app/views/artists invoke test_unit create test/controllers/artists_controller_test.rb invoke helper create app/helpers/artists_helper.rb invoke test_unit invoke assets invoke scss create app/assets/stylesheets/artists.scss invoke resource_route route resources :artists
Just with that one line of code we created an artist controller, artist model, empty artist view folder, and a create_artists table with a column of name.
NOTE: If you made a mistake with the naming of what you just created you can undo all of it with
rails d resource Artist name
Now we are ready to migrate!
code the following to migrate your table
You should get the following schema created
ActiveRecord::Schema.define(version: 2020_03_02_211121) do create_table "artists", force: :cascade do |t| t.string "name" t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false end
Now that our migrations are complete lets see if our server works. To get a hello/rails screen we need to have our views, controller, and routes complete. Luckily for us our rails generate code we entered earlier should have taken care of that. Lets test it out. Type the following:
You should see this in your command line:
=> Booting Puma => Rails 18.104.22.168 application starting in development => Run `rails server --help` for more startup options Puma starting in single mode... * Version 4.3.3 (ruby 2.6.1-p33), codename: Mysterious Traveller * Min threads: 5, max threads: 5 * Environment: development * Listening on tcp://127.0.0.1:3000 * Listening on tcp://[::1]:3000
Great lets go to http://localhost:3000/ on our web browser and you will see the following:
Now that we know our server works lets create our index controller/views:
Creating our Index Controllers/Views
Let's start creating our artist controllers at app/controllers/artists_controller. Here we will start with a blank index method.
class ArtistsController < ApplicationController def index end end
Now lets go to localhost3000/artists and see our index page:
Rails is telling us we don't have a index.html.erb in the views page. So lets make one.
Go to app/views/artists and create an index.html.erb page by entering the following in the command line
Now go back to localhost3000/artists and you will notice a blank page. This is good news! We now have a index.html.erb page we just need to fill it out with forms.
Code the following on your index.html.erb page:
<h1>Index Page</h1> <% @artists.each do |artist| %> <td> Artist link:</td> <td><%=link_to artist.name, artist_path(artist) %></td> <%end%>
Let's head back to our controller page and fill out our index method.
def index @artists = Artist.all end
Head back to your index page and you will see the following
Now that we know that our index page will load we need to code a create controller and views page to allow us to create and display an artist on our index page.
Creating our Artist Create Controller/Views
#artists_controller.rb def new @artist = Artist.new end def create @artist = Artist.new(artist_params) if @artist.save redirect_to @artist else render :new end end private def artist_params params.require(:artist).permit(:name) end
There is a lot going on here so lets break it down.
First under the private section we added a method for artist params. By adding it under private it provides an interface for protecting attributes from end-user assignment.
Next we created an create method that if the artists is successfully created and saved it will redirect you to the artist show page (which we will create later). If it is not saved it will render the new page again.
Next lets create our new.html.erb page.
First create the view page:
Next code the following on the page:
<h1>Create an Artist</h1> <%= form_for @artist do |f| %> <%= f.label :name %> <%= f.text_field :name %> <br /> <%= f.submit %> <% end %>
This will show the following on localhost3000/artists/new:
Next lets code our show controllers/views
Creating Artist Show Controller/Views
Lets start by creating a show method:
def show @artist = Artist.find(params[:id]) end
Next lets fill out the show.html.erb page
#show.html.erb <h1>Show Page</h1> <h1><%= @artist.name %></h1> <%= link_to 'Home', artists_path%>
Now once you create an artist it will take you to the show page of that artist. If you click on the home button on the show page it will take you back to the index page.
Lets head back to our controller and create an edit and update method
#app/controllers/artists_controller.rb def edit @artist = Artist.find(params[:id]) end def update @artist = Artist.find(params[:id]) @artist.update(artist_params) if @artist.save redirect_to @artist else render :edit end end
The edit method just requires us to find the current artists we are trying to edit. The update method we first find the artist and if the artist is found we update and redirect to the show page. Otherwise we render the edit page again (which we will make next)
Now that we have our controller completed we will create our edit.html page which is where we will edit and update our artist.
#app/views/artist/edit.html.erb <h1>Editing <%= @artist.name %></h1> <%= form_for @artist do |f| %> <%= f.label :name %> <%= f.text_field :name %> <br /> <%= f.submit %> <% end %>
Now if we change the name of our artist it will save the change and send us back to the show page.
But what if we want to go to the edit page from the show page? One line of code will fix that.
<h1>Show Page</h1> <h1><%= @artist.name %></h1> <%= link_to 'Home', artists_path%> #new code <%= link_to 'Edit', edit_artist_path(@artist)%>
Now we can create, edit, and update our artist. The last thing we need to do is be able to delete an artist.
Deleting an Artist
First add the following code to the bottom of your show page. This will add a delete button.
<%= button_to "Delete", artist_path(@artist), method: :delete %>
Now we just need to make our destroy controller. Lets create a destroy method and add it to our artist controller:
def destroy @artist = Artist.find(params[:id]) @artist.destroy flash[:notice] = "Artist has been deleted." redirect_to artists_path end
The following method will find then destroy the current artist. It will then alert the user that the artist has been deleted.
You've done it, you have created a full CRUD app from scratch using Rails