struktur db :
class CreateBooks < ActiveRecord::Migration
def self.up
create_table :books do |t|
t.string :title
t.boolean :available
#t.timestamps
end
end
def self.down
drop_table :books
end
end
halaman /books
index.html.erb
<table>
<tr>
<th> </th>
<th>ID</th>
<th>Judul</th>
<th>Status</th>
</tr>
<% form_tag stok_habis_checked_books_url, :method => :put,
:name=>'booksForm' do %>
<%= render :partial => @books %>
<tr>
<td colspan="2"><%= submit_tag 'Stok Habis Semua', :id =>
'submit', :disabled => true %></td>
<td></td>
<td></td>
</tr>
<% end %>
</table>
penjelasan singkat:
- form mengarah ke url /books/stok_habis_checked dgn method put
- koleksi row buku di render dgn partial (each loop)
- tombol submit dalam keadaan disable
_books.html.erb
<tr>
<td><%= check_box_tag "books[#{book.id}]", "1", false, :onclick =>
"enableSubmit()", :class => 'booksChkBox' %></td>
<td><%= book.id %></td>
<td><%=h book.title %></td>
<td><%= book.status %></td>
<td><%= link_to 'Stok Habis', stok_habis_book_path(book), :method =>
:put %></td>
<td><%= link_to 'Edit', edit_book_path(book) %></td>
<td><%= link_to 'Destroy', book, :confirm => 'Apakah anda yakin?',
:method => :delete %></td>
</tr>
penjelasan singkat:
- membuat checkbox dgn name=books[id bukunya] dgn bgini elemen
checkbox dalam bentuk array yg dibedakan oleh indexnya dalam hal ini
id buku
- fungsi javascript enableSubmit() pada checkbox untuk mengaktifkan
tombol submit form
- stok_habis_book_path(book) mengarah ke url /books/id-buku/stok_habis
dengan method put
fungsi javascript :
<script>
function enableSubmit() {
var enable = false;
$A($$('input.booksChkBox')).each(function(el) {
if(el.checked)
enable = true;
}
);
if(enable) {
$('submit').enable();
}
else{
$('submit').disable();
}
}
</script>
penjelasan singkat :
jika salah satu checkbox dicek maka tombol submit aktif, jika smua
checkbox tdk dicek, maka tombol submit non aktif
fungsi prototype js:
$A utk collection element2 dalam hal ini check box
$$() css selector 'input.booksChkBox' = input elemen dgn class 'booksChkBox'
$('id') = getElementById, .enable() .disable() utk manipulasi aktif
non aktif elemen
sebelumnya diatas ada 2 path custom yg saya buat :
- /books/stok_habis_checked
- /books/id-buku/stok_habis
utk membuatnya tambahkan berikut pada routes.rb
map.resources :books,
:member => { :stok_habis => :put },
:collection => { :stok_habis_checked => :put }
penjelasan singkat :
- :member = utk menangani yg berhubungan dgn per record data, misal
masing2 row buku
menghasilkan pola url = /books/id-data/path-nya
- :collection = utk menangani yg berbuhungan dgn kumpulan data
mengahsilkan pola url
/books/path-nya
method put saya gunakan menganut prinsip REST dmana utk operasi
mengubah data dalam hal ini UPDATE database menggunakan verb http
'put'
utk modelnya bgini :
book.rb
class Book < ActiveRecord::Base
def status
(self.available)? 'tersedia' : 'stok habis'
end
def self.find_all_available(status)
find(:all, :conditions => ["available = ?", status])
end
def self.stok_habis_utk_buku_ini(ids)
ActiveRecord::Base.connection.update("UPDATE books SET
available =
'f' WHERE id IN ("+ids+")")
end
end
penjelasan singkat :
- (self.available)? jikabenar : jikasalah
menggunakan self karena jika dihilangkan ruby menganggapkan sbg
expression yg blum didefenisikan initialize sehingga menjadi false.
self.available menjalankan method available methodnya ga ada karna di
buat on the fly oleh rails melalui method_missing mengacu pd konvensi
rails akan membaca field available pada table
- self.stok_habis_utk_buku_ini, merupakan class method sehingga
didefenisikan dgn self. utk mengupdate saya menggunakan pola pikir
database relational, cara pak Booking Heaven (jujur saya tdk tahu nama
anda, coba search di blog saya keywordnya:'psikologi nama')
menggunakan pola pikir ActiveRecord, ini penyakit jg, kebiasaan AR
jadi lupa SQL. cara beliau tdk salah tp tdk optimal. cukup dgn
perintah : "UPDATE books SET available = 'f' WHERE id IN (1,2,3,4)"
1,2,3,4 id yg mau di update utk akses SQL langsung dari AR saya
gunakan method ActiveRecord::Base.connection.update
beralih ke controller
class BooksController < ApplicationController
...
...
def stok_habis
book = Book.find(params[:id])
respond_to do |format|
if book.update_attribute(:available, false)
flash[:notice] = 'Book was successfully updated.'
format.html { redirect_to(books_url) }
format.xml { head :ok }
else
format.html { render :action => "index" }
format.xml { render :xml => book.errors, :status =>
:unprocessable_entity }
end
end
end
def stok_habis_checked
ids = params[:books].keys.join(',')
Book.stok_habis_utk_buku_ini(ids)
redirect_to(books_url)
end
end
penjelasan singkat :
- def stok_habis utk ubah data buku menjadi stok habis berdasarkan idnya
- def stok_habis_checked utk ubah beberapa buku menjadi stok habis
- params[:books].keys.join(',') mengambil parameter array dgn nama
books (books[keynya])
saya hanya ambilnya keynya saja dlm hal ini isinya merupakan id buku,
valunya td saya isi '1' tdk diperlukan. form html akan bertingkah laku
dgn mengirim parameter hanya checkbox yg telah dicek saja.
params[:books] merupakan hash yg punya key dan val, saya ingin jadikan
string sperti ini 1,2,3,4 => pake join(',')
berpindah ke selenium_on_rails
books_test.rsel
# masukkan data dari /test/fixtures/* ke database
setup :fixtures => :books
# buka halaman /books
open '/books'
# pastikan judulnya
assert_title 'Case Study - Daftar Buku-buku'
# pastikan form element di render
assert_element_present "document.booksForm"
# pastikan data-data buku di render
assert_element_present "css=input.booksChkBox"
# pastikan tombol Stok Habis dalam keadaan disable
assert_element_present "css=input[type='submit'][disabled]"
# tambah buku baru
click 'link=Tambah Buku'
# tunggu page di render 3 detik
wait_for_page_to_load 3000
# berpindah ke halaman /books/new
# gunakan test case partial _new_book.rsel
include_partial 'new_book', :title => 'Buku Baru'
_new_book.rsel
# insert data pada form
# isi title
type "css=input[id='book_title']", title
# check available
check "css=input[id='book_available']"
# click submit
click "css=input[type='submit']"
sisanya silahkan yg lain tambahin, rspec, stories
saya blom pernah pake flex,jquery
malas ke github
malas pake posgres, sqlite bs cpt bwt develop
codenya menyusul kalo sempat diupload
On 5/23/08, [EMAIL PROTECTED] <[EMAIL PROTECTED]> wrote:
> saya coba cara acak2
>
> tunggu
>
> On 5/21/08, Arie Kusuma Atmaja <[EMAIL PROTECTED]> wrote:
>> 2008/5/21 Booking Heaven <[EMAIL PROTECTED]>:
>>
>>> Kata-kata stock habis benar2 mem-brainwash otak saya, karena yang ada
>>> diotak saya adalah tombol stock habis maksudnya menghapus stock. atau
>>> mencari stock yang kosong.
>>
>> berikut adalah gambaran output yang diinginkan (harus diselesaikan
>> secara berurutan):
>>
>> GET /books
>>
>> ID, Title, Action
>> 1 , Ruby Indonesia, Stok Habis | Edit
>> 2 , Sinatra Indonesia, Stok Habis | Edit
>>
>> bila diatas sudah selesai, maka tambahkan fitur checkbox di setiap
>> record yang Anda render/tampilkan.
>>
>> ID, Title, Action
>> [ x ] 1 Ruby Indonesia, Stok habis | Edit
>> [ x ] 2 , Merb Indonesia, Stok Habis | Edit
>> Stok Habis
>>
>> nilai standar: sertakan link github.com untuk langsung di clone dan di
>> periksa.
>> nilai bonus: bila _Tombol_ stok habis di bagian bawah tsb hanya aktif
>> jika checkbox di klik.
>> nilai bonus++: bila memenuhi nilai standar dan nilai bonus sekaligus
>> komplit spec'ing keseluruhan, sampai user stories dan selenium dan
>> ubah ke dalam jquery semua => saya serius kalau ada yg bisa ntar kalo
>> di JKT ketemu saya traktir (!)
>> nilai super bonus: bila memenuhi semua 3 poin diatas dan sediakan
>> dalam bentuk flex, ganti db dgn postgres dan kembangkan kreativitas
>> ide tsb menjadi query database yg lebih rumit/asyik => selain saya
>> traktir sekalian Anda bawa resume ke saya (!)
>>
>> sedikit clues:
>>
>> GET /books
>> PUT /books/:id
>>
>>> bahasa pak dosen mengandung ambiguitas, atau mungkin otak saya yang
>>> miskin
>>> kosa kata. Mohon pencerahan masalahnya saya masih kurang bisa memahami
>>> bahasa dosen S4. hehehe
>>
>> dosennya gak ada. yg ada cuma monyet2x tu di blog pada mo ngumpul ntar
>> di Jakarta.
>>
>> Semoga beruntung...
>>
>> Blog http://tinyurl.com/2bjgvn
>> sebut weh apah aja..... ngacirrr (!)
>>
>> ------------------------------------
>>
>> ID-Ruby
>> Berdiskusi dan belajar bersama Bahasa Pemrograman Ruby, termasuk segala
>> varian Ruby (JRuby, Rubinius, IronRuby, XRuby), dan program yang dibuat
>> dengan Ruby (Ruby on Rails, JRuby on Rails, Merb)
>>
>> http://rubyurl.com/Q8DD
>> http://news.gmane.org/gmane.comp.lang.ruby.region.indonesia
>>
>> Yahoo! Groups Links
>>
>>
>>
>>
>
>
> --
> irfani
>
>
> http://irfani.web.id
> Y! : irfani_s
>
--
irfani
http://irfani.web.id
Y! : irfani_s