Admin Interface untuk Rails

Sebagai developer yang datang dari framework Django, kekurangan Rails dari Django yang langsung terasa adalah tidak adanya fasilitas interface admin dari Rails. Admin interface di sini maksudnya GUI di mana kita bisa mengedit data-data yang ada pada database yang diakses aplikasi kita.

Berhubung saya perlu interface admin untuk aplikasi saya, saya cari-carilah soal admin di Rails. Ternyata ada dua gem yang biasa digunakan: Active Admin dan Rails Admin. Beda utamanya: Rails Admin otomatis mendeteksi struktur model dan menyusun interface adminnya, sementara Active Admin lebih fleksibel tapi harus disusun sendiri.

Sebenarnya membuat interface lewat Active Admin juga ngga susah-susah banget (ada Rail Casts-nya!), tapi berhubung saya perlunya simpel dan pengen langsung pakai saja, akhirnya saya pilih Rails Admin, hehe.

Menginstall Rails Admin itu mudah, tinggal ikuti saja dokumentasi di halaman githubnya. Tetapi ada beberapa gotcha yang saya temukan saat menginstallnya untuk aplikasi saya

  1. Rails Admin (Active Admin juga) menggunakan Devise untuk setup akun administratornya. Ini bisa menimbulkan konflik kalau kita menggunakan sistem otentikasi sendiri. Di kasus saya, saya menggunakan method sign_in saya sendiri, yang bentrok dengan method sign_in nya Devise. Ini lumayan bikin saya garuk-garuk kepala, hehe.
  2. Kalau aplikasi kita memakai gem will_paginate, ia akan konflik dengan gem kaminari yang digunakan Rails Admin. Tenang, ada solusinya.

Setelah ulik-ulik sebentar, berjalanlan Rails Admin dalam aplikasi saya. Buat yang penasaran Rails Admin seperti apa, nih ada live demonya.

Mematikan Server Rails yang Tertinggal

Ada kalanya kita kehilangan akses ke terminal yang menjalankan server development Rails. Akibatnya, kita tidak bisa mematikan server dengan menggunakan Ctrl+C seperti biasanya. Nah, jangan khawatir, kita tetap dapat mematikan server r mudah

Pertama, kita harus cari tahu PID dari server rails. Dengan asumsi server rails berjalan di port 3000 seperti biasanya, gunakan perintah berikut:

Kemudian gunakan perintah di bawah, dengan mengganti PIDnya sesuai PID rails server yang kita dapatkan tadi

Jreng! Server mati dan port 3000 pun sudah terbebas lagi.

Kembali

Halo semua!

Wah sudah lama ya saya tidak menulis di sini. Harap maklum, saya baru saja melangsungkan salah satu event terpenting dalam hidup saya. Yak, 23 Maret yang lalu saya baru saja melangsungkan pernikahan. Di antara kesibukan mempersiapkan pernikahan sampai pindahan ke kontrakan baru, akhirnya saya tidak sempat menyentuh rails lagi deh.

Sekarang saya sudah mulai settle dengan kehidupan baru, maka saatnya menghidupkan kembali blog ini. Saya berniat memberi konsep baru. Blog ini nantinya tidak melulu memberikan tutorials tentang rails, tapi juga tentang membangun sebuah aplikasi web pada umumnya dan juga ide-ide dan opini saya tentang web development. Semoga masih tetap diterima para pembaca blog ini :D

 

Memulai Proyek tanpa Koneksi Internet

Seperti yang semua pengguna Rails tahu, saat kita membuat proyek baru, rails akan berusaha mendownload gem-gem terbaru. Ini jadi masalah saat kita tidak sedang mempunyai koneksi internet, dan juga lumayan hambur quota untuk yang koneksinya terbatas seperti saya, hehe.

Ternyata ada cara untuk memulai proyek rails baru tanpa koneksi internet:

1. Buat proyek baru dengan menonaktifkan bundler

2. Install bundle dari gem2 yang sudah ada di pc local kita

Tentu persyaratannya adalah kita harus sudah pernah menginstall semua gem-gem yang diperlukan oleh proyek baru kita.

Voila! Proyek baru tanpa koneksi internet!

Meng-clone Proyek Rails

Kemarin saya mencoba untuk meng-clone suatu project Rails dari github. Ternyata ada beberapa hal yang perlu diperhatikan kalau kita meng-clone proyek Rails yang dibuat orang lain

  1. Pastikan versi ruby yang terinstall dalam komputer kita sama dengan yang digunakan untuk mengembangkan proyek rails tersebut. Saya sempat mengalami masalah gara-gara si proyek dikembangkan di ruby 1.9.3 sementara saya menggunakan ruby 2. Inilah kegunaan dari version manager semacam RVM.
  2. Lakukan  $ bundle install  untuk meng-install semua gem yang diperlukan.
  3. Cek config/database.yml yang mengatur bagaimana Rails terkoneksi dengan database kita.
  4. Buat database dengan perintah  $ rake db:create
  5. Terakhir, kita harus meload skema database. Gunakan perintah  rake db:schema:load . JANGAN GUNAKAN $ rake db:migrate  karena lebih lambat dan bisa jadi tidak akurat menggambarkan skema database terakhir.

Oke, semoga membantu anda menghindari kepusingan yang saya alami :)

 

Membaca file CSV untuk mengisi database Rails

Belajar Ruby on Rails lebih asik kalau langsung diterapkan untuk membuat aplikasi. Setelah menyortir beberapa kandidat ide, akhirnya saya memilih untuk mengembangkan Brentimana (github), untuk belajar Rails. Tujuan appnya:

  1. pengguna bisa mencari halte Transjakarta terdekat dari suatu tempat
  2. pengguna bisa melihat tempat-tempat apa saja yang terjangkau dari suatu halte Transjakarta

Pertama, tentu saya harus tahu dulu ada berapa sih halte TJ itu. Di laman wikipedia Indonesia ini ada jawabannya. Tapi berhubung saya malas input satu persatu, akhirnya saya copas html tabel-nya, buka di excel, bersihkan, dan save-as csv. Nah, cara membaca file csv inilah yang ingin saya share di sini.

1. Taruh file csv di direktori seeds, misal:

2.  Di dalam file db/seeds.rb , masukkan

3. Untuk mengisi database, tinggal menggunakan perintah

 

Demikian, semoga bermanfaat!

 

Pengaruh Variable di Tag form_for

Halo! Wah artikel kali ini terlambat dari jadwal biasa. Mohon maaf pemirsa setia, saya masih harus belajar manajemen energi diri nih.

Beberapa hari yang lalu, ada yang bertanya di grup facebook Rails Indonesia tentang perbedaan penggunaan variable dalam tag form_for saat menulis views. Saya jadi ingat, dulu saya juga sempat bingung saat baru belajar. Jadi artikel singkat kali ini akan membahas tentang pengaruh variable di tag form_for

Seperti biasa, ambil contoh aplikasi standar kita. Aplikasi ini menggunakan satu partial untuk form pada views new dan edit.

apps/views/posts/_form.html.erb

Kita lihat, partial ini menggunakan instance variable @post. Html yang dihasilkan dari  tag ini akan berbeda, tergantung dari variable @post tersebut.

Dalam aksi new, nilai @post adalah

Html yang dihasilkan oleh form_for

Dalam aksi edit, nilai @post tergantung dari url REST yang diberikan, walaupun dalam kode aksinya tidak disebutkan secara eksplisit. Ini adalah konvensi dari Rails.

Tag html yang didapat dengan membuka http://localhost:3000/posts/1/edit adalah

Kita lihat, walaupun  syntax di view partialnya sama persis, hasil kode html yang dihasilkan berbeda, tergantung dari aksi controller dan nilai variable @post-nya. Atribut action, class, id, dan method dari tag <form> akan berubah sesuai dengan isi dari variable @post. Untuk aksi edit, ada sebuah hidden input tambahan dengan value=”patch”. Ini untuk memberitahu Rails bahwa kita akan melakukan method PUT, yaitu mengupdate data. Hidden input ini diperlukan karena standar html hanya mengenal method POST dan GET.

Sekarang, kalau kita menggunakan symbol :post sebagai pengganti instance variable @post, tanpa mengganti kode controllernya.

app/views/posts/_form.html.erb

Html untuk aksi new

dan aksi edit

Kita bisa lihat bahwa atribut action dari tag <form> tetap berubah sesuai controllernya, tapi kita kehilangan atribut class dan id. Selain itu kita juga tidak mendapatkan hidden input value=”patch” untuk aksi edit.

Oke, sekian saja artikel dari saya tentang perbedaan variable untuk tag form_for. Semoga cukup menjelaskan.

 

 

 

 

API Consumer untuk Public API dengan jQuery

Halo! Dalam rangka menuntaskan tutorial sebelumnya tentang public API, kali ini kita akan membahas tentang client atau consumer dari public API tersebut. Untuk kesederhanaan, client-nya hanya akan berupa satu lembar halaman html yang memanfaatkan jQuery. Hari ini libur dulu Ruby dan Rails nya :D. Aplikasi ini diadaptasi dari sini.

Dasar dari client ini adalah begini: Kita akan mempunyai sebuah list <ul> ber-id sesuai dengan post pada aplikasi public API kita. Kemudian kita gunakan jQuery untuk mengambil data “title” dan “content” dari post ber-id tersebut.

Dalam contoh kali ini kita akan ambil post ber-id 1, maka html-nya akan menjadi super sederhana

Fungsi jQuery akan mengiterasi setiap elemen ber-class post, mengambil-id nya, dan menjalankan fungsi untuk mengambil data saat halaman di-load

Sedangkan fungsi yang akan mengambil data dari aplikasi Rails kita seperti ini

Fungsi tersebut akan menghubungi API kita sesuai dengan url dan id post. Bagian dataType: “jsonp” akan memberitahu jQuery untuk mengurus callback yang kita butuhkan. Bila responnya sukses, maka isi halaman html kita akan ditambahkan dengan judul dan isi post kita.

Berikut adalah kode lengkap API consumer kita. Silahkan dicoba, tentu dengan terlebih dulu menjalankan aplikasi API Rails kita di localhost. Walaupun penyedia API maupun consumer sama2 lokal, tapi karena berbeda port kita tetap membutuhkan JSONP.

Selesai sudah pembahasan public API kita. Artikel berikutnya akan kembali membahas soal Ruby dan Rails. Semoga bermanfaat!

 

Membuat public API dengan Rails 4

Sebagai versi terbaru dari Rails, Rails 4 sudah menyediakan fasilitas yang memudahkan kita menyediakan akses data kita dalam format JSON. Hal ini sangat bermanfaat saat kita membuat API public untuk aplikasi kita. Hari ini kita akan membahas pembuat API public dasar. Sebelum lupa, artikel ini diadaptasi dari sumber ini.

Mari mulai dari aplikasi standar kita. Misalkan kita sudah punya post ber-id 1 (jika Anda belum punya, coba buat satu post dalam aplikasi standar tersebut). Post pertama itu akan dapat kita lihat dengan mengunjungi link http://localhost:3000/posts/1. Nah, tanpa menambah kode satu baris-pun, kita dapat mengakses versi JSON dari data post itu di http://localhost:3000/posts/1.json . Mantap kan?

Selesai perkara dong kita? Eits, tidak semudah itu, hehe. Di dunia internet ada yang namanya same origin policyIntinya begini: misalkan aplikasi standar kita ditaruh di server www.apstandar.com, kemudian sebuah aplikasi klien yang ditaruh di server lain, misal www.cobaapi.com mencoba mengakses data aplikasi standar kita dalam format json. Nah, karena si aplikasi klien ini berbeda lokasi dengan aplikasi standar kita, respons-nya tidak akan sampai.

Lantas bagaimana? Salah satu yang teknik yang biasa digunakan adalah dengan menggunakan format JSON with Padding (JSONP). Kita akan buat aplikasi standar kita merespon request “.js” dan merespon dengan sebuah javascript.

app/controllers/posts_controller.rb

Sekarang kalau kita kunjungi http://localhost:3000/posts/1.js , kita masih akan melihat respon JSON seperti biasa, tetapi kalau kita membuka http://localhost:3000/posts/1.js?callback=article, Kita lihat JSON kita sudah “terbungkus” dalam method callback yang kita sediakan. Dengan begini, data JSON kita bisa di”konsumsi” aplikasi eksternal walaupun berada pada domain yang berbeda.

Rails juga memberikan fasilitas untuk merapikan kode controller kita. Coba modifikasi kembali controller kita hingga menjadi

app/controllers/posts_controller.rb

Ok, mari kita lihat. Pertama kita keluarkan respond_to dari aksi ‘show’ dan ke dalam class PostsController. Di dalam ‘show’, kita ganti respond_to dengan respond_with, dan kita jadikan @post sebagai argumennya. Di dalam blok respond_with, kita hanya mendeskripsikan format .js, karena respon untuk format inilah yang “aneh” sendiri.

Yak begitu saja public API sederhana kita. Dalam artikel selanjutnya saya akan bahas tentang contoh aplikasi klien untuk publik API ini. Ciao!

Rails dengan Passenger dan Nginx

Setelah kita selesai membuat suatu aplikasi web, tentu kita ingin menyajikannya bagi pengguna kita. Untuk itu kita perlu menggunakan  aplikasi web server yang mempunyai kapasitas produksi. Pada artikel kali ini saya akan membahas mengenai bagaimana menyiapkan suatu VPS untuk menyajikan Rails dengan Nginx (dibaca enjin-ex) dan Passenger, suatu kombinasi yang populer. Oh ya, VPS kita berbasiskan Ubuntu 12.04.

1. Instalasi RVM

Yang pertama perlu dilakukan adalah di mesin VPS kita adalah instalasi RVM. Dengan RVM kita dapat menggunakan berbagai versi Ruby dalam mesin kita. Bila ingin, RVM dapat diganti dengan rbenv.

Install curl bila belum terinstall. Kita memerlukan curl untuk mengunduh RVM

Kemudian unduh RVM dengan curl

Jalankan script RVM

Kemudian install requirement RVM

RVM telah terinstall

2. Instalasi Ruby dan Rubygems

Sekarang kita bisa menginstall versi ruby sesuai keinginan. Dalam contoh ini saya akan menginstall versi ruby 1.9.3 via rvm

Beritahu rvm untuk menset versi default

Kemudian untuk mengunduh library ruby kita pasang rubygems

Yak, ruby dan rubygems sudah terpasang. Silahkan dicek

3. Instalasi Rails

Sekarang instalasi Rails tinggal urusan mudah.

Rails juga perlu JS runtime untuk bisa berjalan. Biasanya saya menginstall nodejs

Install juga git dan bundler untuk memanage aplikasi kita

Sampai di sini mesin sudah bisa digunakan untuk pengembangan Rails. Tinggal menambahkan Passenger dan Nginx

4. Instalasi Passenger dan Nginx

Masuk ke bagian instalasi web server kita. Pertama install Passenger

Sebelum lanjut ke nginx, install dulu requirementnya

Lalu kita gunakan Passenger untuk menginstall Nginx

Akan muncul layar yang memandu kita dalam instalasi nginx. Ikuti saja sampai nginx terinstall.

5. Konfigurasi Nginx

Agar aplikasi Rails kita dapat disajikan, tentu kita harus memberitahu Nginx di mana lokasinya. Sebagai contoh, misalkan aplikasi kita ada di /railcode/sample_app/

Install nano, sebuah text editor

Buka file configurasi nginx

Cari bagian server lalu ganti isinya sebagai berikut

/opt/nginx/conf/nginx.conf

Ingat, rootnya harus diarahkan ke direktori public dari aplikasi rails kita.

Jalankan Nginx, dan aplikasi kita sudah siap tersaji.

Supaya lebih mudah men-start dan stop nginx, kita akan gunakan startup script.

Download startup script dengan wget

Pindahkan script ke direktori init.d dan buat menjadi executable

Buat agar nginx dijalankan pada saat sistem startup

Dengan startup script kita bisa menggunakan perintah berikut