Scaffolding
Scaffolding realizes CRUD(Create, Read, Update, Delete) operations easily.
Scaffolding has special, and migration file is also created
by scaffold command
This is not practical way but, it is very useful to learn 😉
Create Scaffolding set
mode, controller, views, assets, etc…
Example)
rails g scaffold item title:string price:integer publish:string published:date
Use scaffold. Almost same as model definition.
Directory structure is following.
/application /app /models item.rb : items table model class /controllers items_controller.rb : controller(CRUD) /views /items index.html.erb : list index.json.jbuilder : list(json) edit.html.erb : edit show.html.erb : show details show.json.jbuilder : show details(json) new.html.erb : create _form.html.erb : create/edit common form /assets /javascripts items.js.coffee : controller coffeescript /stylesheets items.css.scss : books controller SCSS scaffolds.css.scss : SCSS for Scaffolding /helpers items_helper.rb : books controller helper /db /migrate 20141016145059_create_itemks.rb : migration file /test /models item_test.rb : Model class test script /helpers items_helper_test.rb : View helper /controllers items_controller_test.rb : Controller test script /fixtures items.yml : Fixture file
Next step, we will do migration.
Do migration
rake db:migrate
(Already exist rake db:migrate:reset)
You can see list http://localhost:3000/items
Delete
rails destroy scaffold item
Route
config/routes.rb
resources :items
Check routes using command
rake routes
Prefix | Verb | URL pattern | Controller#Action | Role |
---|---|---|---|---|
items | GET | /items(.:format) | items#index | List |
POST | /items(.:format) | items#create | Register | |
new_item | GET | /items?new(.:format) | items#new | Create form |
edit_item | GET | /items/edit(.:format) | items#edit | Edit form |
item | GET | /items/:id(.:format) | items#show | Detail |
PATCH | /items/:id(.:format) | items#update | Update | |
PUT | items/:id(.:format) | items#udpate | Update | |
DELETE | items/:id(.:format) | items#destroy | Delete | |
GET|POST|PATCH | /:controller(/:action(/:id))(.:format) | :controller#:action |
Actions and Views
All actions are already implemented by Rails
app/controllers/items_controller.rb
List(index) action
def index @items = Item.all end
View
index.json.jbuilder : JSON format
http://localhost:3000/items.json
items/index.html.erb
This is template
<h1>Listing items</h1> <table> <thead> <tr> <th>Title</th> <th>Price</th> <th>Publish</th> <th>Published</th> <th colspan="3"></th> </tr> </thead> <tbody> <% @items.each do |item| %> <tr> <td><%= item.title %></td> <td><%= item.price %></td> <td><%= item.publish %></td> <td><%= item.published %></td> <td><%= link_to 'Show', item %></td> <td><%= link_to 'Edit', edit_book_path(item) %></td> <td><%= link_to 'Destroy', item, method: :delete, data: { confirm: 'Are you sure?' }</td> </tr> <% end %> </tbody> </table> <br> <%= link_to 'New Item', new_item_path %>
Some links are generated automatically.
link_to
<%= link_to 'Show', item %> # @item.id
The link is /items/1
ViewHelpers
Helper | Path |
---|---|
items_path | /items |
item_path(id) | /items/:id |
new_item_path | /items/new |
edit_item_path(id) | /items/:id/edit |
Show
Show each item details
app/controllers/items_controller.rb
before_action :set_item, only: [:show, :edit, :update, :destroy] def show end private def set_item @item = Item.find(params[:id]) end
Retrieve data using id.
show.html.erb
<p id="notice"><%= notice %></p> <p> <strong>Title:</strong> <%= @item.title %> </p> <p> <strong>Price:</strong> <%= @item.price %> </p> <p> <strong>Publish:</strong> <%= @item.publish %> </p> <p> <strong>Published:</strong> <%= @item.published %> </p> <%= link_to 'Edit', edit_item_path(@item) %> | <%= link_to 'Back', items_path %>
notice tag : notice message place holder
new, create
Form
app/views/items/_form.html.erb
<%= form_for(@item) do |f| %> <% if @item.errors.any? %> <div id="error_explanation"> <h2><%= pluralize(@item.errors.count, "error") %> prohibited this book from being saved:</h2> <ul> <% @item.errors.full_messages.each do |message| %> <li><%= message %></li> <% end %> </ul> </div> <% end %> <div class="field"> <%= f.label :title %><br> <%= f.text_field :title %> </div> <div class="field"> <%= f.label :price %><br> <%= f.number_field :price %> </div> <div class="field"> <%= f.label :publish %><br> <%= f.text_field :publish %> </div> <div class="field"> <%= f.label :published %><br> <%= f.date_select :published %> </div> <div class="actions"> <%= f.submit %> </div> <% end %>
Actions
app/controllers/items_controller.rb
def new @item = Item.new end def create @item = Item.new(item_params) respond_to do |format| if @item.save format.html { redirect_to @item, notice: 'Item was successfully created' } format.json { render :show, status: :created, location: @item } else format.html { render :new } format.json { render json: @item.errors, status: :unprocessable_entity } end end end
Get post data
params.require(:item).permit(:title, :price, :publish)
edit/update
app/controllers/items_controller.rb
def edit end def update respond_to do |format| if @item.update(item_params) format.html { redirect_to @item, notice: 'Item was successfully update.' } format.json { render :show, status: :ok, location: @item } else format.html { render :edit } format.json { render json: @item.errors, status: :unprocessable_entity } end end end
Views
app/views/items/edit.html.erb
<h1>Editing item</h1> <%= render 'form' %> <%= link_to 'Show', @item %> <%= link_to 'Back', items_path %>
destroy
app/controllers/items_controller.rb
def destroy @item.destroy respond_to do |format| format.html { redirect_to items_url, notice: 'Item was successfully destroyed.' } format.json { head: no_content } end end