Paperclip Run Function Bug?

Sudah sebulan lebih rasanya file gambar yang memiliki nama file dengan karakter spasi " " tidak bisa diupload, saya kira ada masalah dengan browser atau ImageMagick. Selalu error 'File is not recognized by the 'identify' command', sudah juga mencoba solusi seperti dalam posting di sini.

Akhirnya setelah saya coba jalankan command identify di server langsung dan tidak ada masalah, saya coba menginstall plugin paperclip dan menggunakan plugin dibanding paperclip gem dan mencoba menelusuri codenya, ternyata masalahnya sederhana seperti ini:

file paperclip.rb yang original

file paperlcip.rb hasil modifikasi yang file_name_bug_free

Alhamdulillah!

Playing With Ruby Meta Programming

irb(main):001:0> require 'meta-test.rb'
=> true
irb(main):002:0> ["one", "two", "three"].repeat(3)
=> ["one", "one", "one", "two", "two", "two", "three", "three", "three"]
irb(main):003:0>

irb(main):003:0> %w{one two three four five six seven eight nine ten}.remove("i","o")
=> ["ne", "tw", "three", "fur", "fve", "sx", "seven", "eght", "nne", "ten"]

Meta Programming with Ruby is fun, isn't it? :)

Rails Tips : Prawnto PDF Generator Dynamic File Name

I was confuse how to generate dynamic file name for prawn generated pdf file, because there's lack of example and document here http://cracklabs.com/prawnto/demos.

What is Prawnto? Prawnto is is a rails plugin leveraging the new prawn library to produce compiled pdf views, as for me i'm using it for custom reporting tools. OK, let's getting back to the problem, what should you do is place prawnto definition in your method rather than in controller's callbacks : # /app/controllers/transactions_controller.rb

# /app/views/transactions/show.pdf.prawn

Hope this is useful, cheers :)

Ruby Tips : Mengubah Isi Array Menjadi Tipe Data Tertentu

Sebagai contoh kita ingin menggabungkan dua buah Array dengan elemen yang bervariasi, misalnya String dan Integer dan membuang elemen yang duplicated. Ilustrasinya sebagai berikut :
x = [1, 2, 3, 4]
y = ["1", "2", "3", 5]
Array x memiliki elemen dengan tipe data Integer sedangkan Array y memiliki String dan Integer yang sebenarnya jika String tersebut diubah tipe datanya menjadi Integer akan memiliki elemen yang hampir sama dengan Array x. Lalu bagaimana cara agar ketika kedua Array tersebut digabungkan kita mendapatkan Array dengan data yang unik? Caranya sangat sederhana dan cukup satu baris saja di Ruby : Dari String ke Integer
irb(main):003:0> z = (x+ y).flatten.collect { |i| i.to_i } 
=> [1, 2, 3, 4, 1, 2, 3, 5]
irb(main):004:0> z.uniq
=> [1, 2, 3, 4, 5]
Dari Integer ke String :
irb(main):005:0> z = (x+ y).flatten.collect { |i| i.to_s }
=> ["1", "2", "3", "4", "1", "2", "3", "5"]
irb(main):006:0> z.uniq
=> ["1", "2", "3", "4", "5"]
Atau bahkan Float
irb(main):007:0> z = (x+ y).flatten.collect { |i| i.to_f }
=> [1.0, 2.0, 3.0, 4.0, 1.0, 2.0, 3.0, 5.0]
irb(main):008:0> z.uniq
=> [1.0, 2.0, 3.0, 4.0, 5.0]
Demikian, semoga bermanfaat :)

Rails Tips : Paperclip Only Creates Original Directory?

Pernah mengalami hal yang sama? Anda sudah menginstall plugin paperclip tapi ketika anda mengupload file gambar, paperclip hanya menulis file originalnya saja, tidak menambahkan file thumb atau style lain yang telah anda definisikan di dalam model? Penyebabnya ternyata adalah ImageMagick dan RMagick belum terinstall di system, untuk kasus yang saya alami adalah menggunakan sistem ubuntu. Berikut langkah - langkahnya : Install ImageMagick dan libmagick9-dev terlebih dahulu :
sudo apt-get install imagemagick libmagick9-dev
Jika berhasil dilanjutkan dengan menginstall RMagick
sudo gem install rmagick --no-rdoc --no-ri
Tambahkan parameter :styles di model, dan coba upload file kembali, insyaAllah berhasil :)
has_attached_file :photo, :styles => { :normal => "100x100#", :small => ["70x70>", :jpg] }

Scheduling With Rufus Scheduler

Saya mendapat sebuah proyek kecil, tujuannya sangat sederhana yaitu mengambil semua data dari sebuah website dan menyimpannya ke dalam database untuk kemudian ditampilkan kembali lewat wordpress, data tersebut kemudian harus selalu up-to-date sesuai dengan website yang akan di-crawl. Ini berarti saya membutuhkan sebuah proses penjadwalan tugas untuk memeriksa apakah ada update di website tersebut, karena kita mengambilnya secara "ilegal". Proses crawlingnya sendiri menggunakan hpricot, kurang lebih isinya seperti ini, masih kotor saya pasang di model property.rb.
require 'rubygems'
require 'hpricot'
require 'open-uri'
 
class Property  title, :link => link }
  end
  resultset
end

def get_latest_update
  Property.create!(scrap(1))
end 
Balik lagi ke masalah task scheduling alias penjadwalan tugas, saya biasanya mengandalkan crontab, atau kalau lagi disiplin ya ngelirik ke backgroundDrb, tapi untuk tugas yang satu ini kayaknya terlalu ribet kalo pake BackgroundDrb dan saya lagi nggak pengen pake crontab. Akhirnya saya menemukan solusi yang menurut saya sangat affordable di Rails Inside. Dan saya pun memutuskan untuk mempelajari Rufus Scheduler dengan proyek kecil tadi sebagai kelinci percobaannya. Bagaimana caranya? Pertama pastinya install gem rufus-scheduler. Kalo perlu froze gem-nya ke vendor/gems.
sudo gem install rufus-scheduler
Lalu buat file bernama task_scheduler.rb di dalam direktori config/initializers. Isinya kurang lebih seperti ini :
scheduler = Rufus::Scheduler.start_new

scheduler.every("1h") do
   Property.get_latest_update!
end
Kita dapat memanggil metode yang ada di model langsung ke file task_scheduler tersebut, layaknya rake task. Mudah dan sederhana bukan? tanpa crontab dan lebih mudah dibaca serta di-maintain dibanding crontab.