Kali ini saya akan membawakan tutorial Ruby on Rails sederhana tentang bagaimana menyimpan data sekaligus banyak. Saya tidak akan membahas sejarah semenjak apa itu ruby, kemudian juga saya tidak akan menjelaskan disini bagaimana cara instalasi ruby maupun ruby on rails itu sendiri, karena semua sudah jelas dibahas di Situs Resmi Ruby Indonesia maupun bila masih ada yang kurang jelas tentu segala lapisan masyarakat Indonesia berikut seluruh anggota-anggota yang berada di luar negeri pun boleh berdiskusi belajar bersama di milis ID Ruby.

Baiklah, kita mulai saja. Pertama buka Konsole nya (Kalau Linux), buka Terminalnya (Kalau Mac OS X), buka cmd (klik Start , klik run , ketik cmd , tekan enter | kalau Windows).

Masuklah ke direktori tempat belajar favorit Anda, lalu ketiklah perintah mesra ini:

rails countries

Seperti biasa, selalu tekan enter setelah perintah apa pun juga di komputer ya.

Kemudian masuk ke direktori countries ataupun nama project yang baru Anda beri nama tadi.

cd countries

Sampai sini Anda bisa periksa dengan perintah script/about (bila Anda memakai windows, selalu sertakan ruby script/about) saat ini saya sedang memakai gem terbaru, ruby versi 1.8.6 patch ke 111, dan rails 1.2.2 dari gem.

Saya selalu terbiasa berlatih diri dan mengantisipasi teknologi baru dengan menggunakan rails edge, caranya sebagai berikut (ya, Anda ikuti juga ya, prinsipnya semua gampang, tidak ada yang tidak bisa, yang ada, adalah, tidak mau):

rake rails:freeze:edge

Kemudian dari situ Anda tunggulah sebentar, boleh minum minum dulu boleh makan makan dulu sembari menunggu rails versi terbaru banget ini selesai didownload dan dipasangkan otomatis di direktori countries Anda itu. Lama tidaknya bergantung dengan kecepatan koneksi Internet yang Anda punya tentunya.

Sambil nunggu freezing kalo lama, sambil dengar/nonton lagu toxic Britney asik juga sambil koding (click for its source). yup, along with its jap translation for friends who also like jap like me. thanks to someone who uploaded it on Google! Domo arigato, omoshiroi na kore.

And this one ((AMV) Naruto – Linking Park – Numb – Neji & Hinata) thanks to someone who uploaded it on Google! Merci.. / iya, taunya baru merci doang -_-

Kemudian bila sudah, selalu pasang rspec. Caranya:

script/plugin source svn://rubyforge.org/var/svn/rspec/trunk/

script/plugin install rspec

script/plugin install rspec_on_rails

Awas, sekali lagi, saya disini tidak akan membahas apa dan bagaimana itu rspec, pokoknya kalau tidak jelas dengan rspec ini bisa langsung tanyakan dan belajar langsung bersama teman-temannya juga yang sama-sama sedang belajar di milis ID Ruby.

Oke. Semua plugin yang biasa saya pakai sekarang sudah ada. Tinggal kita pakai sekarang:

script/generate rspec

Ya, sudah selesai ya, kalau belum atau ada yang salah-salah ada yang error jangan malu bertanya ya, malu bertanya sesat di jalan.

Komputernya sudah berasap asap belum? Sepertinya ada yang kelupaan, apa coba?

svn? Nggak… Kita pakai git aja ;-)

Caranya gouampang

git init

enter

Awas, kalau dapat error bilang, malu bertanya ya tidak sampai sampai tujuan atau bisa juga sampai tujuan tapi berkelok-kelok sementara ada yang sampai tujuan hanya dalam kurun waktu kurang dari sekejap mata.

Lanjut, ketik lagi:

vim .gitignore

lalu di dalam editor vim tercinta itu ketikkan makhluk makhluk yang ingin dicuekin sebagai berikut:

(sebelum mengetik di vim caranya tekan huruf ‘i’ tanpa tanda petik)

db/schema.rb
db/*.sqlite3
config/database.template.yml
tmp/*
log/*
public/photos/*
vendor/*

cara keluar dari vim ketik

:x (atau kalau dibaca : ‘titik dua’ lalu tekan huruf ‘x’)

sudah.

Kita lanjut

Sekarang setelah diinisiasi, kita masukkan file file project nya ke repo git lokal kita.

git add .

iya, sekarang tinggal kita commit

gca

lalu di dalam editor tercinta Anda itu, ketik

commit pertama!!!

oops, kalau Anda dapat error gara-gara gca, ya berarti belum pasang alias di bash Anda. Caranya ya pakai cara panjang saja dengan perintah git commit -a -m “commit pertama!!!!”

Bila sudah. SELAMAT! Anda telah sukses punya repositori lokal git ;-)

Silakan dilanjut untuk selalu testing testing ya untuk kemudian koding.

Ketikkan perintah ini untuk membuatkan kerangka kerja yang akan dipakai untuk model country:

script/generate rspec_model country name:string special:boolean

Kemudian perintah berikut ini untuk otomatis membuatkan tabel countries sesuai dari kerangka kerja yang barusan saja kita berikan di perintah ruby sebelumnya tadi:

rake db:migrate –trace

duh jangan merinding atau takut macam-macam, ini bukan film suster ngesot ataupun pemblokiran sumber daya sumber daya penting di Indonesia oleh perampok perampok yang insyaf disaat mereka menghembuskan nafas terakhirnya, tapi sengaja membiasakan agar terbiasa dengan pesan-pesan cinta dari rake secara khusus, dan dari ruby secara umum.

Lanjut, kalau sudah boleh Anda periksa status database schema Anda dengan perintah berikut:

script/about

atau kalau mau lebih spesifik caranya dengan perintah sebagai berikut:

rake db:version

Kalau mau intip intip dulu boleh:

ls spec/models

cat spec/models/country_spec.rb

oke, saatnya kita memanggil editor textmate tercinta itu. Cukup ketikkan:

e

Awas, itu shortcut di laptop saya sendiri [-( triknya itu cuma alias aja dari mate kemudian direktori apa yang diperlukan untuk dibuka, supaya tetap ringan (walau biar dibuka semua juga ringan kok, ini karena alasan narsis pribadi penulis saja)

ih

Ada yang kelupaan lagi ya? Ada!

autotest

Nah kalau di background jalan terus autotestnya baru boleh kita balik lagi ke textmate ya, buat yang nggak pakai mac, ya bisa pakai alternatif lain, misalkan radrails ini sih saya taunya ketika zamannya saya dulu belajar rails sih, kalau yang sekarang sedang hot saya sudah kurang mengikuti berhubung saya memang cuma pakai tiga editor aja (ViM, Emacs sama TextMate / disesuaikan mood sama kebutuhan sama kemampuan juga sih).

Nah sekarang kita mau ngapain nih?

Lha ini mbikin tutorial kok pakai nanya-nanya? mungkin gitu kata pengamat yang ingin meralat saya karena perhatian yang sangat. Bukan …… ini cuma ingin membiasakan pembaca yang memang sedang belajar saat ini untuk berpikir lurus, ehm, bukan berpikir berkelok-kelok dan tersesat.

Berpikir test dulu, baru kemudian codes!

Kalau berpikir test, pasti berpikir tentang requirement spesifikasi apa yang diinginkan bisa berjalan di program.

AHA!! Anda ingin kita bikin tabel countries ini harus punya nama! Kan nggak ada pak, negara tanpa nama, ah itu sih nanti bisa gak habis habis kalau bicara OOT ke politik lagi soal negara tanpa nama tapi mencengkeram sih serahkan pada yang lebih ahli saja daripada penulis yang newbie forever inih. piss. Shi Bubeng Pendekar Tanpa Nama (Nah kalau yang barusan ini asli nama Pendekar Tanpa Nama tulisan Kho Ping Ho, nah kan kita kena virus OOT, huh)

Ayo fokus, kembali lagi ke topik…

Jadi kita akan bikin spesifikasi negara harus punya nama!

Ah dari tadi bicara spesifikasi spesifikasi spesifikasi terus, ayo dong diimplementasikan coding lagi jangan banyak bacot mulu’ … lha, ini supaya terbiasa, kalau mengigau spesifikasi spesifikasi spesifikasi di ruby apa rubinius …. aduuh jangan OOT ke rubinius dulu dong, fokus dong fokus… baru belajar neh! (hajar yang nghajar mainan mulu’) langsung ingatnya spec spec spec …. iya, pakainya rspec !

caranya:

require File.dirname(__FILE__) + '/../spec_helper'

describe Country do
  before(:each) do
    @country = Country.new
  end

  it "should require a name field" do
    @country.save.should_not be_true
  end
end

iya, jadi yang asalnya should be valid itu Anda hapus saja ya. Ganti sama yang Anda perlukan aja. Anda mungkin bertanya, lho kok nggak ada fixture ? Lha memang karena kita tidak butuh.

Sambil simpan file spec/models/country_spec.rb tsb Anda boleh sambil intip gerakan gerakan bawah tanah hacker hacker di konsole/terminal Anda (haha ini hanya untuk mendramatisir saja apa apa yang berderau di panggung jengking teruk sangat itu, belajar kalau monoton itu itu saja kurang masuk, malah tidur, kalau ini, kalau pusing, takut tanya sama mas arie, ya alamat dikasih selamat kebingungan sendiri, salah sendiri sudah ditawari tanya lagi kalau masih bingung setelah baca masih sungkan sungkan gak pede mau tanya doang).

ya autotest di balik layar Anda itu bergerak gerak menandakan ada yang tidak benar, ya tentu saja, karena memang kita baru menuliskan spesifikasi spesifikasi yang menjadi requirement/kebutuhan si jelita yang ingin dibikinkan oleh Anda sebagai jockey, ehm (ngelirik yang mahasiswa ahyo hari gini nyontek? ama joki?) -_-

Argh sekarang kita lanjut implementasikan satu baris kode validasi harus ada itu tadi. Harus ada apa? Nah lo barusan dibahas udah lupa lagi … kebanyakan OOT kali neh .. ya harus ada nama buat negara .

ini copy paste dari file app/models/country.rb

class Country < ActiveRecord::Base
  validates_presence_of :name
end

Iya, pada kenyataannya Anda hanya butuh menuliskan satu baris validates tersebut saja, ini sengaja saya kopi kan semua supaya Anda yang baru belajar jangan ragu-ragu atau takut salah, karena ragu-ragu dan takut salah itu adalah pangkal dari kegagalan, bila ingin maju dan sukses, harus berpikir positif, maju terusss, pantang mundurrr, jatuh bangkit jatuh bangkit, itu biasa… merdeka!

Nah sembari Anda bergemuruh akan semangat kemerdekaan, jantung Anda pun berdegup ingin menjentik keindahan warna hijau pertana sukses rspec yang ditampakkan oleh autotest yang berjalan di balik layar itu (hidup hacker indonesia!) Lho? -_-

Oke, sampai disini ada yang ingin ditanyakan dulu nggak?

pokoknya kalau gathering ID Ruby kalo ada saya nggak boleh pasif jadi pendengar setia, harus aktif, jadi tukang protes apalagi kalau bisa menambahkan, pasti bakal disuka sama terutama yang sudah sepah sepah dan jarang turun gunung itu.

Bangsa Indonesia harus belajar untuk berpikiran terbuka, optimis, maju, terus jangan dibiasakan selalu disuapi, dijajah, hingga terbiasa ditarik ditali lubang hidung ibarat kerbau kemanapun kehendak “angin” bertiup. Bangkit Indonesia, berlari mencapai visi hakiki bukan retorika sesat! (Ih, ini paragraf hanya untuk konsumsi diri pribadi Arie saja ini buat bahan introspeksi kayaknya lumayan juga, hmm…) biasa.. belagak bijak -_-

“Pak! Tanya! Kalo saya tanya, nanti mas Arie marah gak?”, tanya Sitorus.

Saya: “Ya kalau soal rails yang dibahas tadi ngapain marah Rus… Kan katanya kalau sering marah cepat tua.”

………………………………………………………

Ya sudah titik titik panjang diatas mewakili diskusi yang lagi belajar gitu di kos kos di warung warung di sekolah sekolah di kantin kantin di mana pun teman-teman pemula rails ini sedang belajar dan bercengkerama berdiskusi membahas solusi guna mencapai pencerahan yang ingin didapat.

Ta’ lere’ wae soko kene.

Lanjut, setelah model sudah lewat kita jamah, sekarang kita mulai menggauli controller. Seperti biasa, kita tentukan dulu lagi spesifikasi spesifikasi spesifikasi apa aja yang ingin dibikin…. Hmmm… coba dipikir-pikir dulu.

Perlu ada :

  1. Listing Countries atau Daftar Negara-Negara
  2. Form buat simpan data
  3. Proses penyimpanan data dan melempar alih serta pemberi status apakah sukses atau gagal

Nah dari sana, kami belajar untuk berpikir resource atau sumber daya apa yang dibutuhkan?

Bila diterjemahkan dengan Rails dan resource maka jadinya begini:

  1. GET /countries
  2. GET /countries/new
  3. POST /countries

Jadi langsung saja kita menerkam mangsa kita satu ini yaitu file spec/controllers/countries_controller_spec.rb

Pada mulanya:

require File.dirname(__FILE__) + '/../spec_helper'

describe CountriesController do
  
  ##
  # GET /countries
  
  describe "GET 'index'" do
  end # describe "GET 'index'"

  ##
  # GET /
  
  describe "GET 'new'" do
  end # describe "GET 'new'"
  
  ##
  # POST /countries

  describe "GET 'create'" do
  end # describe "GET 'create'"
end

Kemudian simpan, Bim salabim…. Byur Byur…. Ijo… ijo…. ijo…. (Tanda rspec sukses) Nah ini bukan menganjurkan praktek perdukunan, kami hanya menganjurkan yang positif saja, maksudnya kalau yang lagi belajar termasuk programmer yang nggak suka ato jarang mandi, jangan lupa mandi dulu sana!

Buat yang bukan programmer baca ini, jangan ketawa atau tersinggung lho, emang betul tu ada lumayan lho yang kelakuan saking gak mau pindah meninggalkan komputernya sampai gak mau bangkit dari tempat semedinya hanya untuk mandi sebentar.

Sudah OOT jangan kelamaan, ini tulisan jadi melorot nanti -_- terang aja tadi ijo soalnya memang belum ditulis apa-apa specnya. itu baru kerangka.

Sekarang coba kita mulai isi:

….

Setelah 1/2 detik penulis berpikir barusan, tahap demi tahap copy paste dicancel karena watak penulis yang gak sabaran, jadi langsung di copy paste kan keseluruhan isi file spec, kemudian juga seluruh isi file controller, bila yang ingin bertanya lebih lanjut, bisa didiskusikan kalau memang bertemu dengan Arie sendiri ataupun boleh lewat komentar atau lewat milis terserah.

require File.dirname(__FILE__) + '/../spec_helper'

describe CountriesController do
  
  ##
  # GET /countries
  
  describe "GET 'index'" do
    before do
      @country   = mock_model(Country)
      @countries = [ @country ]
      Country.stub!(:all).and_return(@countries)
    end
    
    it "should render template index" do
      load_page
      response.should render_template(:index)
    end
    
    it "should assign a listing countries" do
      Country.should_receive(:all).and_return(@countries)
      load_page
    end
    
    it "should route for GET /countries" do
      route_for(:controller => "countries", :action => "index").should 
        be("/countries")
    end
    
    def load_page(params={})
      defaults = {}
      get :index, defaults.merge!(params)
    end
  end # describe "GET 'index'"

  ##
  # GET /
  
  describe "GET 'new'" do
    it "should render template new" do
      load_page
      response.should render_template(:new)
    end
    
    it "should route for GET /countries/new" do
      route_for(:controller => "countries", :action => "new").should 
        be("/countries/new")
    end
    
    def load_page(params={})
      defaults = {}
      get :new, defaults.merge!(params)
    end
  end # describe "GET 'new'"
  
  ##
  # POST /countries

  describe "GET 'create'" do
    before do
      @params = [
                  { "name" => "Indonesia" }, 
                  { "name" => "Malaysia" }, 
                  { "name" => "Filipina" }, 
                ]
      @country = mock_model(Country)
      Country.stub!(:create!).and_return(true)
    end
    
    it "should directly create! (set and save) all countries ready to save" do
      Country.should_receive(:create!).with(@params).once.and_return(true)
      load_page
    end
    
    it "should assign a flash notice and redirect to index upon success" do
      load_page
      flash[:notice].should_not be_blank
      response.should redirect_to(countries_url)
    end
    
    it "should render back template new upon failure" do
      @country.errors.stub!(:full_messages).and_return([])
      Country.should_receive(:create!).and_raise(ActiveRecord::RecordInvalid.
                                                   new(@country))
      load_page
      response.should render_template(:new)
    end
    
    it "should route for POST /countries" do
      route_for(:controller => "countries", :action => "create").should 
        be("/countries")
    end
    
    def load_page(params={})
      defaults = { :country => @params }
      post :create, defaults.merge!(params)
    end
  end # describe "GET 'create'"
end

Kemudian file controllernya:

class CountriesController < ApplicationController

  ##
  # GET /countries/new

  def new
  end

  ##
  # POST /countries

  def create
    Country.create!(params[:country])
  rescue ActiveRecord::RecordInvalid  
    render :action => :new
  else
    flash[:notice] = "Successfully saved!"
    redirect_to countries_url
  end

end

Hm, kemudian sekarang spec view-nya new:

require File.dirname(__FILE__) + '/../../spec_helper'

describe "/countries/new" do
  it "should display a title New Countries" do
    render 'countries/new'
    response.should have_tag("h1", "New Countries")
  end

  it "should display a form to submit multiple new countries" do
    render 'countries/new'
    response.should have_tag("form[action=?][method=post]", countries_path) do
      20.times do |i|
        with_tag("input[name=?]", "country[][name]")
      end
      with_tag("input[type=submit]")
    end
  end
end

Anda Capek nyalin ngetiknya? Kayaknya saya yang sekarang sudah mulai mengantuk setelah dinina bobokan dengan posting blog saya kali ini … uh. (Lama gak dipijit / pegel2x huhuhu)

Dan ini view new nya. app/views/countries/new.html.erb

<h1>New Countries</h1>

<%= error_messages_for :country %>

<% form_tag "/countries", :method => :post do %>
	<ol>
		<% 20.times do |i| %>
			<li>
				Name : 
				<%= text_field_tag 'country[][name]' %>
			</li>
		<% end %>
	</ol>
	<p>
		<%= submit_tag "Save!" %>
	</p>
<% end %>

Ini sekarang spec viewnya index

require File.dirname(__FILE__) + '/../../spec_helper'

describe "/countries/index" do
  before do
    @country = mock_model(Country, 
      :name => "Indonesia")
    @countries = [ @country ]
    assigns[:countries] = @countries
  end
  
  it "should display a title Listing Countries" do
    render 'countries/index'
    response.should have_tag("h1", "Listing Countries")
  end
  
  it "should list countries" do
    render 'countries/index'
    response.should have_tag("li", @country.name)
  end
  
end

Dan ini isi dari codes viewnya index app/views/countries/index.htmlerb

<h1>Listing Countries</h1>

<ol>
	<% @countries.each do |country| %>
		<li><%= country.name %></li>
	<% end %>
</ol>

Lho lho lho? Anda jadi cemberut gitu tadi pada ngikutin dengar sabar postingan ini ngeliat saya ngantuk baru bisa akan tidur? Mustinya ikut senang dong, daripada saya nggak bisa tidur tidur hayo -_- Rasanya nggak enak lho kalo mo tidur musti macem macem dulu…

“Pak Arie! Dari tadi saya selalu lihat code code menakutkan dan konsole/terminal hacker itu pak, kapan saya boleh pegang mouse pak? kapan saya boleh tes di browser langsung untuk melihat apakah aplikasi saya bisa dipakai dan berjalan atau belum”, Sitorus protes.

Saya jawab, “Oh iya, ya silakan, tinggal Anda ketik script/console lalu buka browser Anda, ketik localhost:3000/countries/new . Nah sudah disana Anda tinggal ketik.”

Udah saya mau tidur dulu.

ps. Buat para sesepuh penasihat Arie yang sangat mendukung Arie menulis dengan sangat sangat sangat sangat sangat……. dimohon masukannya dan obatnya agar Arie bisa menulis sampai selesai secara step by step (request, tutorial juga, jangan langsung satu malam sekali belajar tapi abis gitu langsung sakit masuk angin trus mencret mencret kalo itu mah bukannya belajar tapi penyiksaan tuh, tapi learning by doing satu per satu yang penuh kasih sayang, please)

ps. Buat yang benar-benar sedang belajar rails, kalau ada kata-kata yang kurang berkenan, kami mohon maaf, itu semua semata-mata hanyalah ilusi seorang gembel sebelum tidur.

GLODAK!

Baru saja kepalaku terantuk ke dinding ! lupa commit dulu git nya. Ayo git, kita commit .. ah mau nonton rake spec dulu ya, boleh:

m:spike_multiple_array_form_save arie$ rake spec
(in /Users/arie/spikes/spike_multiple_array_form_save)
...............

Finished in 0.340209 seconds

15 examples, 0 failures
m:spike_multiple_array_form_save arie$ rake stats
(in /Users/arie/spikes/spike_multiple_array_form_save)
+----------------------+-------+-------+---------+---------+-----+-------+
| Name                 | Lines |   LOC | Classes | Methods | M/C | LOC/M |
+----------------------+-------+-------+---------+---------+-----+-------+
| Controllers          |    38 |    19 |       2 |       3 |   1 |     4 |
| Helpers              |     5 |     4 |       0 |       0 |   0 |     0 |
| Models               |     3 |     3 |       1 |       0 |   0 |     0 |
| Libraries            |     0 |     0 |       0 |       0 |   0 |     0 |
| Model specs          |    11 |     9 |       0 |       0 |   0 |     0 |
| View specs           |    39 |    33 |       0 |       0 |   0 |     0 |
| Controller specs     |    99 |    75 |       0 |       3 |   0 |    23 |
| Helper specs         |    11 |     7 |       0 |       0 |   0 |     0 |
+----------------------+-------+-------+---------+---------+-----+-------+
| Total                |   206 |   150 |       3 |       6 |   2 |    23 |
+----------------------+-------+-------+---------+---------+-----+-------+
  Code LOC: 26     Test LOC: 124     Code to Test Ratio: 1:4.8

m:spike_multiple_array_form_save arie$ 

Ya sudah ya sudah sekarang betulan mo tidurrr

git commit -a -m “listing countries and adding multiple countries have been added”

ini source code nya ada di laptop ini, nanti kalo dah nggak ngantuk akan saya update buat taroh dimana gitu akan saya update lagi, ah mulai ngaco nih ampe gw nulis sambil mata penuh air. udah oyasumi.

tut.. tuing.. tuing. .. zzzzzzzzzz

Comments
  1. ahmad isa says:

    Mantep, dah expert nih.
    Posing banget,…:P
    source codenya dah di upload lom??minta urlnya dunk, mau tak donlot coz posing nen .. :)

  2. arisanshi says:

    mantaf!

  3. neng_amna says:

    ayo mas isa…bljr yg bener..ntar klo dah bisa ajarin aq ya..he6x.Semangat!!!!

  4. 41studio says:

    wah, informatif.. bagus buat belajar Rails, semoga bisa bikin artikel tutorial kyk gini lebih banyak lagi kedepannya.. :)

tinggalkan feedback konstruktif atau lebih baik diam

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s