Yukihiro "Matz" Matsumoto

Often people, especially computer engineers, focus on the machines. They think, "By doing this, the machine will run fast. By doing this, the machine will run more effectively. By doing this, the machine will something something something." They are focusing on machines. But in fact we need to focus on humans, on how humans care about doing programming or operating the application of the machines. We are the masters. They are the slaves.
Yukihiro "Matz" Matsumoto, Creator of Ruby

Kamis, 30 Oktober 2014

Implementasi Custom Validator Pada Model Rails

Validasi merupakan hal yang paling fundamental dalam model objek Rails anda, apabila anda tidak menggunakan validasi dengan baik, maka data di dalam tabel database anda akan dipenuhi dengan inkonsistensi. User dapat menginput data yang tidak sesuai dengan keinginan anda pada saat melakukan pengisian dalam form dan tidak mendapatkan peringatan apa-apa.

Pada kesempatan kali ini, saya ingin berbagi tips dalam melakukan impelementasi kustom validator. Rails memberikan banyak sekali validasi yang dapat anda gunakan seperti presence, length, numericaliy, inclusion, format. Ada kalanya anda ingin membuat sendiri validasi kustom yang dapat anda gunakan dalam melakukan validasi pada model.

Sebagai contoh misalnya anda ingin melakukan validasi pada nomor telepon dengan format "0411-3611419". Apabila user memasukkan nomor telepon dengan format 04113611419 maka validasi akan gagal. Dengan menggunakan kustom validasi, kita dapat menetapkan validasi sesuai dengan kondisi yang kita inginkan.

Pertama-tama dibuat terlebih dahulu file berisi validator yang akan kita gunakan. Pada contoh ini file-file validator ditempatkan didalam folder apps/validators. Folder ini tidak secara default dibuat oleh Rails, sehingga anda harus membuatnya sendiri. Dalam folder ini, akan diisi file berisi custom validator yang akan kita buat.



Untuk dapat mengatur agar Rails melakukan load ke dalam path validators ini, perlu anda tambahkan kode ke dalam config/application.rb agar Rails menambahkan path tersebut pada saat melakukan loading.

config.autoload_paths += %W("#{config.root}/app/validators")

Selanjutnya di dalam file yang akan kita jadikan validator, kita isi kode yang akan menjadi validator custom yang akan kita buat. Penamaan dari validator ini cukup krusial, format yang digunakan adalah "NameValidator" dimana name merupakan nama validator yang akan kita pakai. Sebagai contoh disini nama validator yang akan dipakai adalah phone, sehingga penamaan kelasnya menggunakan PhoneValidator.

Class PhoneValidator < ActiveRecord::EachValidator

  def validate_each(record, attribute, value)
    if not value =~ /\b[0-9]{3,4}-[0-9]{7,12}\b/
      record.errors[attribute] << (options[:message] || "Please input valid Indonesian telephone number")
    end
  end
end

Cusom validator ini menggunakan inheritansi dari kelas ActiveRecord::EachValidator sebagai kelasnya. Kemudian digunakan method validate_each dengan argumen berupa record, attribute, dan value. Di dalamnya digunakan if condition dimana bila value tidak memenuhi syarat dari regex maka akan terjadi kegagalan dalam validasi dan kemudian akan diberikan pesan error ke dalam objek.

Setelah proses ini selesai, anda dapat mengimplementasikan custom validator ini kedalam model objek anda seperti contoh dibawah ini.


Selanjutnya untuk melakukan test secara dapat, anda dapat membuka rails console melalui command-line untuk melakukan pengecekan secara langsung.


Pada kode di atas, telephone diberikan nilai dengan string "xxx" yang merupakan format yang salah untuk dilakukan pengecekan apakah validasi error berhasil dijalankan. Dari hasil yang didapat terlihat bahwa validasi berhasil dilakukan dengan melihat pesan errors dengan key telephone. Selanjutnya dilakukan koreksi dengan format telepon yang benar, dan dilakukan validasi. Dapat dilihat bahwa pesan error sudah tidak ada kareana validasi yang dilakukan telah berhasil dan memenuhi syarat.

Semoga tips ini bermanfaat bagi anda. Happy Railings!!!

Rabu, 29 Oktober 2014

Menggunakan Rake Task Untuk Menghapus Data Dalam Tabel Database Rails

Apabila anda ingin menghapus data yang ada dalam tabel database anda secara keseluruhan, saya akan berbagi tips dalam menghapus data dengan membuat Rake task. Langkah yang pertama kali anda lakukan adalah dengan membuat file dengan nama utilites.rake di dalam folder lib/tasks. Kemudian anda tuliskan kode dibawah ini

namespace :utilities do

  desc "Clear database table"

  task :clear_db => :environment do |t, args|

    ActiveRecord::Base.establish_connection
    ActiveRecord::Base.connection.tables.each do |table|

      #memastikan bahwa tabel yang berisi schema migrations anda tidak dihapus
      next if table == "schema_migrations"

      #uncomment code di bawah baris ini apabila anda menggunakan MySQL dan PostgreSQL
      #ActiveRecord::Base.connection.execute("TRUNCATE #{table}")

      #uncomment code di bawah baris ini apabila anda menggunakan SQLite
      #ActiveRecord::Base.connection.execute("DELETE FROM #{table}")


    end
  end
end

Save filenya, dan kemudian anda dapat menjalankannya dari command line menggunakan syntax rake utilities:clear_db. Selanjutnya semua data/row didalam tabel database anda akan dihapus. Cara ini saya dapatkan dari buku Easy Active Record karangan W. Jason Gilmoire yang dapat anda beli secara digital di Leanpub. Semoga tips ini bermanfaat bagi anda.


Dasar YAML Pada Ruby

YAML yang merupakan singakatan dari Yet Another Markup Language adalah bahasa markup yang dibuat untuk menyimpan struktur dari sebuah data. Struktur dari bahasa ini dapat anda lihat dibawah ini:


File YAML diatas berisi sebuah array yang didalamnya terdiri dari sebuah hash, sebagai contoh elemen pertama dari array ini adalah hash dengan key berupa game, year, dan manufacturer. Untuk membuka file YAML dalam Ruby, anda dapat menggunakan standar library YAML.


Dengan mengimport library YAML menggunakan require maka anda dapat menggunakan kelas YAML untuk melakukan manipulasi terhadap file YAML.  Pada kode di atas, variabel game_list digunakan untuk menyimpan array yang berisi hash yang dibuka dengan menggunakan method load_file beserta argumen berupa lokasi file dalam komputer anda.


Anda dapat menggunakan cara yang sama untuk mengakses value dari hash menggunakan key yang ada. Anda dapat menggunakan data ini pada objek atau tabel database yang anda buat untuk diasosiasikan dengan data ini.

Untuk melakukan penyimpanan dari objek anda ke dalam file YAML anda dapat menggunakan method to_yaml seperti contoh dibawah ini.


Menggunakan File.open beserta argumen berupa nama file yang akan kita gunakan dalam menyimpan YAML, digunakan blok dan didalmanya menggunakan method write dengan argumen berupa array game_list yang akan kita simpan ke dalam file YAML.

Hasilnya dapat kita lihat dibawah ini dengan menggunakan text editor.



Untuk anda yang ingin mengetahui lebih jelas mengenai YAML, dapat melihatnya secara langsung di Wikipedia. Di lain waktu saya akan memberikan tips dalam menggunakan file YAML sebagai seeds data pada database Rails.

Kamis, 23 Oktober 2014

Kustomisasi Form Error Rails Bagi Pengguna Bootstrap

Bagi anda pengembang Rails yang menggunakan framework Bootstrap dalam mendesain form bagi website anda, tentu tahu bahwa Boostrap memiliki framework yang sangat lengkap dalam menangani berbagai macam tampilan dalam form anda. Pada saat anda ingin mengindikasikan terjadi kesalahan pada validasi form anda, anda dapat menggunakan class has-error.

Saya akan berbagi tips mengenai langkah yang saya gunakan dalam menghandle warning pada form validasi yang bermasalah. Secara default, rails akan membungkus form yang mengalami kegagalan dalam validasi di dalam div dengan class field_with_errors.

Pada gambar di atas, anda dapat melihat bahwa pada form description terjadi kegagalan dalam validasi, tetapi bagi anda yang menggunakan  Bootstrap tidak mendapatkan tanda-tanda visual bahwa telah terjadi kegagalan validasi pada form. 

Langkah yang akan dilakukan adalah dengan memanipulasi kode yang menghasilkan div ini melalui file config.rb dalam config/application.rb. Tambahkan kode dibawah ini didalam file tersebut dalam kelas Applications.


Setelah itu lakukan test kembali dengan sengaja melakukan kesalahan pada validasi form untuk melihat hasilnya.


Dapat dilihat form yang gagal dalam validasi akan memiliki warna merah menandakan terjadi kesalahan. Dilihat pada Chrome Dev Tool, terlihat bahwa class has-error telah ditambahkan pada div field_with_errors. Semoga tips ini dapat bermanfaat bagi anda semua. Happy Railings.


Rabu, 22 Oktober 2014

Menggunakan Bootstrap Pada Aplikasi Rails

Untuk anda yang ingin menghemat waktu dan biaya dengan menggunakan framework CSS Bootstrap untuk layout desain dari aplikasi Rails anda. Anda dapat mengikuti langkah berikut untuk melakukan installasinya. Instalasi dilakukan menggunakan Bootstrap-Sass. Sassy CSS sendiri merupakan preprocessor yang digunakan untuk memudahkan anda dalam menggunakan sintaks-sintaks khusus dalam file CSS anda seperti menggunakan nesting dan penamaan. 

  • Pertama masuk ke dalam gemfile aplikasi anda dan tambahkan gem bootstrap-sass

  • Jalankan command bundle install pada Terminal untuk memastikan gem yang baru anda tambahkan terinstall ke dalam aplikasi anda
  • Masuk ke file application.css di dalam folder app/assets/stylesheets/, kemudian tambahkan ekstensi .scss untuk dapat menggunakan SASS. Tambahkan 2 line kode berikut untuk mengimport Bootstrap dalam file CSS anda

  • Hal yang paling terakhir adalah menambahkan Javascript Bootstrap ke dalam file application.js dalam folder app/assets/javascripts/. Pastikan urutan kode anda sesuai dengan urutan dibawah ini

  • Setelah semua proses selesai anda dapat menggunakan semua framework CSS Bootstrap mulai dari grid sistem, tipografy, form, table, berbagai tampilan yang membutuhkan javascript seperti modal, carousel, dan yang lainnya. Semua dapat anda langsung lihat di dokumentasi website Bootstrap. Happy CSSing!






Senin, 20 Oktober 2014

Konsep Dasar Test Driven Development Pada Rails

Dalam mengembangkan suatu fitur baru didalam website, dikenal istilah Test Driven Development dalam proses pengembangan. TDD merujuk pada suatu pendekatan dimana kita melakukan list dari spesifikasi fitur yang kita inginkan dalam aplikasi web, menjalankan tersebut dengan hasil fail, melakukan penulisan kode agar hasil dapat dilalui dengan success, kemudian setelah tes berhasil, dilakukan refactor untuk meningkatkan kualitas kode yang ditulis. Proses ini sering disebut, red(fail)-green(success)-blue(refactor). 

Dengan melakukan pendekatan ini, programmer dapat lebih meningkatkan kepercayaan diri mereka akan kode-kode yang mereka tulis, karena kode harus melewati tahapan green terlebih dahulu untuk mengetahui apakah tidak ada kesalahan atau typo dalam penulisan kode. Cara ini mungkin terlihat lamban bagi anda yang baru pertama kali mengenalnya, saya juga mengalami hal yang sama. Sebelumnya, saya tidak pernah melakukan test secara intensif pada kode yang saya tulis, sehingga hampir selalu terjadi error yang sangat sulit saya deteksi dan saya harus buka tutup browser, reload page untuk melakukan debugging sehingga menghabiskan waktu yang cukup lama. Untuk beradaptasi terhadap TDD adalah anda harus terus berlatih dalam menggunakannya sampai pendekatan ini benar-benar menjadi kebiasaan anda dalam penulisan kode.

Berikut saya akan memperlihatkan konsep dasar dalam penulisan kode Rails menggunakan pendekatan TDD ini. Untuk test library yang saya gunakan adalah berupa RSpec dan Capybara. Untuk melihat instalasinya pada aplikasi Rails anda dapat melihat pada artikel ini, RSpec pada Rails.

Contoh ini akan mengimplementasikan fitur routing pada web.


Didalam folder spec, dibuat terlebih dahulu folder baru dengan nama features yang akan menampilkan spec fitur-fitur baru yang akan dibuat. Dalam contoh, ini dibuat spec list product yang akan menampilkan produk dalam route products_path. Dalam file spec, terlebih dahulu diimpor rails_helper yang akan digunakan RSpec dalam menggunakan konfigurasi yang ada. Kemudian digunakan kata kunci describe yang memberikan blok untuk mendeskripsikan konteks dari test yang akan kita lakukan, dimana pada saat ini kita akan menamplikan list indeks dari produk. Di dalam blok deskripsi ini kita akan memberikan test-test yang akan kita lakukan dengan kata kunci it beserta penjelasan dari test yang akan menerima blok berisi ekspetasi yang kita harapkan dari test tersebut.

Dalam spek test diatas, diharapkan agar user sukses menuju ke http://www.example.com/products. Digunakan method RSpec expect untuk melakukan pengecekan apakah path yang berhasil dikunjugi sama dengan products_path.



Tentu saja hasil yang dihasilkan adalah failure, karena belum dibuat implementasi dari kode ini. Hal yang penting disini adalah kita tidak panik dan takut dengan deskripsi error yang dihasilkan, melainkan kita langsung menganalisa error tersebut. Di sini terlihat deskripsi no route matches [get] products, yang berarti Rails belum mengetahui routes /products dalam konfigurasinya. Dari error ini, kita dapat langsung mengimplementasikan kode yang akan kita buat agar hasil nya menjadi hijau atau success.



Pada konfigurasi routes.rb ditambahkan route GET yaitu products yang akan merespon pada action index pada products controller. Kita lakukan lagi test pada RSpec...


Hasil yang didapatkan masih tetap failure, tetapi dengan deskripsi error yang berbeda, sekarang deskripsinya berupa unitialized constant product controller. Langkah berikut yang harus kita lakukan adalah membuat product controller dengan Rails generator beserta method index didalamnya.


Menggunakan rails generator command untuk membuat controller products, disini digunakan kata products dalam bentuk plural sebagai konvensi dari Rails bahwa kontroller menampilkan objek dalam bentuk plural. Berbeda dengan model yang menggunakan bentuk singular.


Setelah products controller berhasil dibuat, berikutanya kita tambahkan method index ke dalam products controller tersebut. Berikutnya kita akan melakukan test lagi melalui Rspec.


Hasil yang diberikan adalah failure dengan deskripsi bahwa Rails tidak menemukan template view untuk ditampilkan yang dalam konvensi rails sesuai dengan nama action yang kita berikan yaitu, index.html.erb dalam folder views/products. Berikut kita akan membuat file tersebut melalui sublime text.


File ini terletak pada path app/views/products, dan digunakan file dengan ekstensi html.erb yang merupaka konvensi dari Ruby untuk menampilkan html yang akan kita tampilkan pada pengguna.
Selanjutnya kita akan melakukan test akhir karena semua kode telah berhasil kita buat, kita akan mengecek apakah ada kesalahan/typo yang kita lakukan pada penulisan kode.


Hasil yang dihasilkan adalah success, test yang dilakukan berhasil untuk menuju ke products_path dan memastikan url yang dituju sama dengan products_path. Apabila anda ingin melakukan refactor code, anda dapat melakukannya, dan pastikan agar hasil yang diberikan melalui RSpec tetap memberikan hasil success.

Begitulah proses secra garis besar yang dilakukan pada saat kita melakukan pengembangan dengan pendekatan TDD. Proses ini memakan waktu yang lebih lama, tetapi dapat meningkatkan kepercayaan diri akan keakuratan kode yang telah kita buat. Saya menganjurkan anda yang belum pernah menggunakan TDD agar mencoba terbiasa untuk menggunakan pendekatan ini, karena pendekatan ini sangat berfungsi dalam jangka panjang, apalagi bila anda mengerjakan proyek dalam skala besar.

Sabtu, 18 Oktober 2014

Kustomisasi Tampilan Output RSpec Pada Rails

Untuk anda yang menggunakan RSpec sebagai unit testing anda pada program Rails yang anda kembangkan, terkadang anda membutuhkan detail yang lebih lengkap terhadap test yang sukses dan gagal. Anda dapat menggunakan syntax berikut di command line:


Output yang dihasilkan yaitu setiap test yang anda telah buat di file spec anda dengan pemberian warna hijau untuk test yang berhasil, merah untuk test yang gagal, dan kuning untuk test yang masih pending.

Untuk anda yang malas untuk mengetik flag --color --format doc, dapat menambahkan parameter di file konfigurasi .rspec yang ada pada root direktori aplikasi Rails anda. Tambahkan sintaks pada gambar di bawah ini. Sehingga secara default rspec anda menggunakan flag ini pada saat anda menggunakan rspec.