Di dalam seri ini kita masih akan melanjutkan project yang telah kita buat di Seri Belajar Ruby on Rails Bagian 11. Jadi, untuk kalian yang sudah tidak menyimpan project Homework Management silahkan download contoh aplikasi di link berikut [Download]
Sebelum memulai, pastikan kembali project Homework Management yang telah dibuat berjalan dengan baik. Jika sudah pasti, let’s begin !
Membuat CRUD sub_category
Seperti biasa, kita buka terminal dan kita jalankan code berikut:
$ rails g scaffold sub_category name:string category_id:integer
$ rake db:migrate
Dengan menjalankan code tersebut, kita telah membuat CRUD untuk sub_category, dan melakukan migrasi ke database.
Langkah berikutnya kita tambahkan validasi dan relasi di model sub_category :
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class SubCategory < ApplicationRecord | |
validates :name, presence: true, length: {minimum: 4} | |
has_many :homeworks | |
belongs_to :category | |
end |
Sesudah menambahkan validasi dan relasi di model sub_category, kita perlu menambahkan relasi juga di model category :
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
has_many :sub_categories |
Setelah menambahkan relasi di model category, kita tambahkan script berikut pada controller sub_categories_controller :
- Tambahkan method ini pada bagian atas sub_categories_controller :This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
before_action :set_categories, only: [:new, :edit, :update, :create] - Tambahkan method berikut pada bagian private sub_categories_controller :This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
def set_categories @category = Category.all end
Modifikasi Views sub_category
Kita ubah terlebih dahulu file app/views/sub_categories/_form.html.erb menjadi :
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<%= form_with(model: sub_category, local: true) do |form| %> | |
<% if sub_category.errors.any? %> | |
<div id="error_explanation"> | |
<h2><%= pluralize(sub_category.errors.count, "error") %> prohibited this sub_category from being saved:</h2> | |
<ul> | |
<% sub_category.errors.full_messages.each do |message| %> | |
<li><%= message %></li> | |
<% end %> | |
</ul> | |
</div> | |
<% end %> | |
<div class="field"> | |
<%= form.label :name %> | |
<%= form.text_field :name, id: :sub_category_name %> | |
</div> | |
<div class="field"> | |
<%= form.label :category_id %> | |
<% if @sub_category.category.present? %> | |
<%= select_tag 'sub_category[category_id]', options_for_select(@category.collect { |c| [c.name, c.id] }, {:selected => @sub_category.category.id}) %> | |
<% else %> | |
<%= select_tag 'sub_category[category_id]', options_for_select(@category.collect { |c| [c.name, c.id] }) %> | |
<% end %> | |
</div> | |
<div class="actions"> | |
<%= form.submit %> | |
</div> | |
<% end %> |
Kita ubah juga file app/views/sub_categories/show.html.erb menjadi :
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<p id="notice"><%= notice %></p> | |
<p> | |
<strong>Name:</strong> | |
<%= @sub_category.name %> | |
</p> | |
<p> | |
<strong>Category:</strong> | |
<%= @sub_category.category.name %> | |
</p> | |
<%= link_to 'Edit', edit_sub_category_path(@sub_category) %> | | |
<%= link_to 'Back', sub_categories_path %> |
Dan yang paling penting, kita ubah file app/views/sub_categories/index.html.erb menjadi :
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<p id="notice"><%= notice %></p> | |
<h1>Sub Categories</h1> | |
<table> | |
<thead> | |
<tr> | |
<th>Name</th> | |
<th>Category</th> | |
<th colspan="3"></th> | |
</tr> | |
</thead> | |
<tbody> | |
<% @sub_categories.each do |sub_category| %> | |
<tr> | |
<td><%= sub_category.name %></td> | |
<td><%= sub_category.category.name %></td> | |
<td><%= link_to 'Show', sub_category %></td> | |
<td><%= link_to 'Edit', edit_sub_category_path(sub_category) %></td> | |
<td><%= link_to 'Destroy', sub_category, method: :delete, data: { confirm: 'Are you sure?' } %></td> | |
</tr> | |
<% end %> | |
</tbody> | |
</table> | |
<br> | |
<%= link_to 'New Sub Category', new_sub_category_path %> |
Dengan mengubah ketiga file tersebut, kita lanjutkan dengan mencoba mengisi data sub_category. Jalankan code berikut:
$ rails s
Buka url http://localhost:3000/sub_categories/new di browser, lalu kita coba membuat satu data baru di sub_category. Kita isikan "Beginner 1" pada kolom name dan pilih "Bahasa Inggris" sebagai category nya. Klik create sub category untuk menyimpan.
Halaman Show Sub_Category |
Jika berhasil menyimpan data, maka browser anda akan menampilkan :
Halaman Show Sub_Category |
Menambahkan data sub_category
Agar pengimplementasian pembuatan dropdown list ini lebih dapat dipahami, kita perlu menambahkan banyak data di sub_category. Tambahkan data sub_category berikut berdasarkan category masing-masing :
Data Sub_Category |
Setelah selesai menambahkan data-data yang ada pada gambar, kita pun dapat menambahkan data sub_category lebih banyak lagi, sesuai dengan keinginan kita.
Modifikasi CRUD Homework
Sebelum mengubah script yang ada pada CRUD homework, kita terlebih dahulu menambahkan atribut sub_category_id kedalam struktur homework dengan cara menjalankan code berikut di terminal.
$ rails g migration AddSubCategoryIdToHomework
Buka file migration tersebut yang ada pada folder db/migrate,dan tambahkan script berikut :
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class AddSubCategoryIdToHomework < ActiveRecord::Migration[5.1] | |
def change | |
add_column :homeworks, :sub_category_id, :integer | |
end | |
end |
Lakukan migrasi dengan menjalankan code berikut di terminal :
$ rake db:migrate
Kita buat relasi baru di model homework, dengan menambahkan script berikut :
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
belongs_to :sub_category |
Selanjutnya kita ubah controller homeworks_controller menjadi seperti berikut :
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class HomeworksController < ApplicationController | |
before_action :set_homework, only: [:show, :edit, :update, :destroy] | |
before_action :set_categories, only: [:new, :edit, :update,:create] | |
before_action :set_sub_categories, only: [:new, :edit, :update,:create] | |
def index | |
@homeworks = Homework.all | |
end | |
def show | |
end | |
def new | |
@homework = Homework.new | |
end | |
def edit | |
end | |
def create | |
@homework = Homework.new(homework_params) | |
respond_to do |format| | |
if @homework.save | |
format.html { redirect_to @homework, notice: 'Homework was successfully created.' } | |
format.json { render :show, status: :created, location: @homework } | |
else | |
format.html { render :new } | |
format.json { render json: @homework.errors, status: :unprocessable_entity } | |
end | |
end | |
end | |
def update | |
respond_to do |format| | |
if @homework.update(homework_params) | |
format.html { redirect_to @homework, notice: 'Homework was successfully updated.' } | |
format.json { render :show, status: :ok, location: @homework } | |
else | |
format.html { render :edit } | |
format.json { render json: @homework.errors, status: :unprocessable_entity } | |
end | |
end | |
end | |
def destroy | |
@homework.destroy | |
respond_to do |format| | |
format.html { redirect_to homeworks_url, notice: 'Homework was successfully destroyed.' } | |
format.json { head :no_content } | |
end | |
end | |
private | |
def set_homework | |
@homework = Homework.find(params[:id]) | |
end | |
def set_categories | |
@category = Category.all | |
end | |
def set_sub_categories | |
@sub_category = SubCategory.all | |
end | |
def homework_params | |
params.require(:homework).permit(:homework_name, :category_id, :deadline, :description, :sub_category_id) | |
end | |
end |
Lalu kita lanjutkan dengan mengubah script app/views/homeworks/index.html.erb menjadi :
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<p id="notice"><%= notice %></p> | |
<%= render 'navigation'%> | |
<h1>Homeworks</h1> | |
<table> | |
<thead> | |
<tr> | |
<th>Homework name</th> | |
<th>Category</th> | |
<th>Sub-Category</th> | |
<th>Deadline</th> | |
<th>Description</th> | |
<th colspan="3"></th> | |
</tr> | |
</thead> | |
<tbody> | |
<% @homeworks.each do |homework| %> | |
<tr> | |
<td><%= homework.homework_name %></td> | |
<td><%= homework.category.try(:name) %></td> | |
<td><%= homework.sub_category.try(:name) %></td> | |
<td><%= homework.deadline %></td> | |
<td><%= homework.description %></td> | |
<td><%= link_to 'Show', homework %></td> | |
<td><%= link_to 'Edit', edit_homework_path(homework) %></td> | |
<td><%= link_to 'Destroy', homework, method: :delete, data: { confirm: 'Are you sure?' } %></td> | |
</tr> | |
<% end %> | |
</tbody> | |
</table> | |
<br> | |
<%= link_to 'New Homework', new_homework_path %> | |
<%= link_to 'New Category', new_category_path %> |
Dan kita ubah juga script yang ada pada app/views/homeworks/show.html.erb menjadi :
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<p id="notice"><%= notice %></p> | |
<%= render 'navigation'%> | |
<p> | |
<strong>Homework name:</strong> | |
<%= @homework.homework_name %> | |
</p> | |
<p> | |
<strong>Category:</strong> | |
<%= @homework.category.present? ? @homework.category.name : "-" %> | |
</p> | |
<p> | |
<strong>Sub-Category:</strong> | |
<%= @homework.sub_category.present? ? @homework.sub_category.name : "-" %> | |
</p> | |
<p> | |
<strong>Deadline:</strong> | |
<%= @homework.deadline %> | |
</p> | |
<p> | |
<strong>Description:</strong> | |
<%= @homework.description %> | |
</p> | |
<%= link_to 'Edit', edit_homework_path(@homework) %> | | |
<%= link_to 'Back', homeworks_path %> |
Setelah mengubah index dan show pada homework. Maka kita teruskan dengan mengubah script yang ada pada app/views/homeworks/_form.html.erb menjadi :
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<%= form_with(model: homework, local: true) do |form| %> | |
<% if homework.errors.any? %> | |
<div id="error_explanation"> | |
<h2><%= pluralize(homework.errors.count, "error") %> prohibited this homework from being saved:</h2> | |
<ul> | |
<% homework.errors.full_messages.each do |message| %> | |
<li><%= message %></li> | |
<% end %> | |
</ul> | |
</div> | |
<% end %> | |
<div class="field"> | |
<%= form.label :homework_name %> | |
<%= form.text_area :homework_name, id: :homework_homework_name %> | |
</div> | |
<div class="field"> | |
<%= form.label :category %> | |
<% if @homework.category.present? %> | |
<%= select_tag 'homework[category_id]', options_for_select(@category.collect { |c| [c.name, c.id] }, {:selected => @homework.category.id}) %> | |
<% else %> | |
<%= select_tag 'homework[category_id]', options_for_select(@category.collect { |c| [c.name, c.id] }) %> | |
<% end %> | |
</div> | |
<div class="field"> | |
<%= form.label :sub_category_id %> | |
<% if @homework.sub_category.present? %> | |
<%= select_tag 'homework[sub_category_id]', options_for_select(@sub_category.collect { |c| [c.name, c.id] }, {:selected => @homework.sub_category.id}) %> | |
<% else %> | |
<%= select_tag 'homework[sub_category_id]', options_for_select(@sub_category.collect { |c| [c.name, c.id] }) %> | |
<% end %> | |
</div> | |
<div class="field"> | |
<%= form.label :deadline %> | |
<%= form.date_select :deadline, id: :homework_deadline %> | |
</div> | |
<div class="field"> | |
<%= form.label :description %> | |
<%= form.text_area :description, id: :homework_description %> | |
</div> | |
<div class="actions"> | |
<%= form.submit %> | |
</div> | |
<% end %> |
Dengan menjalankan http://localhost:3000/homeworks/new di browser, dapat terlihat di dalam form terdapat dua buah dropdown list. Namun dropdown list tersebut tidak saling terikat. Data pada dropdown list sub_category tidak dipengaruhi nilai dari dropdown list category.
so, congratulations !! anda telah berhasil membuat dropdown sub-category