Posted: December 29th, 2009 | Author: gozali | Filed under: Programming, Rails, Ruby, Work | Tags: pdf, prawn, prawnto, ruby, ruby on rails | 1 Comment »
I was getting stuck 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
1
2
3
4
5
6
7
8
9
| def show
prawnto :prawn => { :page_size => 'A4',
:left_margin => 40,
:right_margin => 30,
:top_margin => 40,
:bottom_margin => 30},
:filename => "invoice_#{@transaction.id}_customer_#{@transaction.customer_id}.pdf"
render :layout => false
end |
# /app/views/transactions/show.pdf.prawn
1
| <%= link_to "Generate PDF", transaction_url(transaction.id, :format => 'pdf') %> |
Hope this is useful, cheers
Posted: September 1st, 2009 | Author: gozali | Filed under: Programming, Rails, Ruby, Work | Tags: imagemagick, paperclip, rmagick, ruby, tips | 1 Comment »
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 :
1
| sudo apt-get install imagemagick libmagick9-dev |
Jika berhasil dilanjutkan dengan menginstall RMagick
1
| sudo gem install rmagick --no-rdoc --no-ri |
Tambahkan parameter :styles di model, dan coba upload file kembali, insyaAllah berhasil
1
| has_attached_file :photo, :styles => { :normal => "100x100#", :small => ["70x70>", :jpg] } |
Posted: August 20th, 2009 | Author: gozali | Filed under: Life, Rails, Ruby | Tags: Rails, ruby, rufus-scheduler | 2 Comments »
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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| require 'rubygems'
require 'hpricot'
require 'open-uri'
class Property < ActiveRecord::Base
class << self
def scrap(page)
resultset = []
doc = Hpricot open("http://www.xxxxx.com/property_list?page=#{page}")
items = doc.search("html_tag")
items.each do |item|
title = item.at("h4").innerText.gsub(/( |\n|\s)+/im, ' ').squeeze(' ').strip unless item.at("h4").nil?
link = item.at("a").attributes["href"].gsub(/( |\n|\s)+/im, ' ').squeeze(' ').strip unless item.at("a").nil?
resultset << { :title => 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.
1
| sudo gem install rufus-scheduler |
Lalu buat file bernama task_scheduler.rb di dalam direktori config/initializers. Isinya kurang lebih seperti ini :
1
2
3
4
5
| 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.