Rabu, 18 Maret 2015

Cara penggunaan reCAPTCHA di Rails application

Untuk pengimplementasian reCaptcha di Rails application kita bisa menggunakan gem recaptcha.

Langkah pertama kita tambahkan gem recaptcha ke Gemfile

gem 'recaptcha'

Selanjutnya di terminal kita menjalankan perintah :

$ bundle install

Sekarang kita tinggal mengkonfigurasinya dibagian config/initializers/recaptcha.rb untuk penggunaan di aplikasi Rails. Tapi sebelumnya pastikan bahwa anda mempunyai public_key dan private_key untuk aplikasi anda, jika belum anda dapat membuatnya disini.

Recaptcha.configure do |config|
  config.public_key  = '<public_key anda>'
  config.private_key = '<private_key anda>'
end

Langkah selanjutnya adalah kita tinggal menggunakan recaptcha_tags disetiap form yang kita inginkan.

Contoh :

<%= form_for @foo do |f| %>
  '#...#'
  <%= recaptcha_tags %>
<% end %>

Lalu gunakan function verify_recaptcha untuk verify captcha di controller, contoh:

respond_to do |format|
  if verify_recaptcha(:model => @foo, :message => "Oh! It's error with reCAPTCHA!") && @foo.save
    # ...
  else
    # ...
  end
end

Demikian cara penggunaan reCaptcha dalam Rails application.

Keep Learning and Happy Coding :)

Senin, 16 Maret 2015

Penggunaan gem permanent_record dan nested_form dalam satu rails aplikasi

Dalam artikel ini kita akan membahas tentang permasalahan yang timbul ketika kita mempunyai gem 'permanent_records' dan gem 'nested_form' di aplikasi Rails kita.  

STUDI KASUS

Misal dalam aplikasi yang kita buat terdapat model Order dan  LineItem.


order.rb

class Order < ActiveRecord::Base
  has_many :line_items, :dependent => :destroy
  accepts_nested_attributes_for :line_items, allow_destroy: true
end

line_item.rb

class LineItem < ActiveRecord::Base
  belongs_to :order
end


Di orders_controller.rb untuk Rails 4 jangan lupa dibagian strong_params untuk menyertakan attributes dari line_items

orders_controller.rb

def order_params
  params.require(:order).permit(:order_number, :order_date,         :line_items_attributes => [:id, :item_name, :price, :_destroy])
end

Yang harus diingat untuk nested_form di rails 4 adalah memasukan attributes "_destroy" di attributes child, jika attibutes ini tidak dimasukan maka ketika kita menghapus nested maka record tersebut akan tetap ada di database.

RECORD TETAP ADA?

Inilah yang penulis baru-baru ini alami, meskipun semua attributes dari line_items model sudah dimasukan di strong params tentu saja dengan penambahan "_destroy" ternyata record yang dihapus dinested masih tetap tampil ketika melakukan edit untuk order.

SOLUSI

Yang dilakukan pertama kali adalah mengecek schema.rb dari table line_item apakah memiliki column deleted_at atau tidak. Jika ternyata ada, maka dua cara yang pernah penulis lakukan untuk mengatasi permasalahan diatas, yaitu :

1 . Membuat migrasi baru untuk meremove column deleted_at
 
$ rails g migration remove_deleted_at_in_line_items 
$ rake db:migrate

2. Edit orders_controller.rb

def update
  @order.line_items.where('deleted_at IS NOT NULL').delete_all
  ...
end

Setelah itu lakukan pengetesan untuk menghapus nested record, dan boom record yang semula tidak bisa dihapus akan hilang.

Demikian yang bisa disampaikan untuk pembahasan ini,

Selamat mencoba dan Happy Coding.

Cara Implementasi Soft Delete dengan gem 'permanent_records'

Soft delete adalah sebuah solusi ketika kita membutuhkan suatu data / record tidak muncul di view tapi masih tersimpan di database sebagai "archive". Jadi, ketika ada keperluan untuk mencari / mengembalikan ( restore ) data yang sudah dihapus user, kita masih bisa melakukan query untuk mencari dan menampilkan data tersebut.

Contoh: user menghapus data penjualan hari ini dengan tidak sengaja. Karena implementasi soft delete, system admin akan mampu melakukan restore data tersebut dengan relatif mudah.

Untuk implementasi soft delete, kita bisa menggunakan gem 'permanent_records'. Berikut ini cara integrasinya:

INSTALASI

Masukan gem 'permanet_records' di gemfile:

gem 'permanent_records', github: 'JackDanger/permanent_records'

selanjutnya jalankan di terminal:

$ bundle install

KEGUNAAN

Setelah penginstalan selesai dilakukan kita dapat menjalankan beberapa method untuk melakukan pengetesan.

User.find(3).destroy # akan menjalankan action soft_delete untuk user yang bersangkutan
User.find(3).destroy(:force) # akan menjalankan action delete dan record akan dihapus dari database
User.destroy_all # Soft-delete semua user
User.delete_all # Permanent delete semua user

Bagaimana menampilkan record?

User.deleted.find(...) # akan menampilkan user yang sudah tersoft_delete
User.not_deleted.find(...) # hanya akan menampilkan record yang belum disoft_delete

Dapatkah kita mengembalikan record yang sudah di soft_delete?

User.find(3).destroy
User.find(3).revive #restore use yang sudah di soft-delete

Demikian sedikit pembahasan untuk gem 'permanent_records' yang dapat kami berikan, semoga bermanfaat. Untuk lebih detail tentang gem ini, silahkan kunjungi laman berikut.

Happy Coding :)

Implementasi gem 'nested_form' di Rails 4

Dalam tutorial ini kita akan mencoba untuk membuat nested_form dari dua model yang saling berelasi dalam sebuah aplikasi rails dengan mengunakan gem 'nested_form'.

INSTALASI

Edit gemfile
gem 'nested_form'

Langkah selanjutnya adalah mengjalankan perintah
$ bundle install

Lalu kita masukan di application.js
//= require jquery_nested_form

PENGUNAAN

Jika kita mempunyai model Order yang mempunyai relasi has_many :line_items, untuk dapat menggunakan gem ini kita harus memasukan accepts_nested_attributes_for :line_items di model Order kita, dan jika menginginkan nested object agar dapat dihapus maka kita dapat menambahkan allow_destroy: true setelahnya.

Berikut adalah ilustrasinya :

order.rb
class Order < ActiveRecord::Base
 has_many :line_items, :dependent => :destroy
  accepts_nested_attributes_for :line_items, allow_destroy: true
end

line_item.rb
class LineItem < ActiveRecord::Base
  belongs_to :order
end

Selanjutnya adalah kita dapat mengunakan nested_form_for untuk dapat menggunakan nesting ini.

<%= nested_form_for @order do |f| %>

Maka dengan demikian kita dapat menggunakan link_to_add dan link_to_remove didalam builder tersebut yang berguna untuk menambahkan dan menghapus nested record, contoh.

<%= f.fields_for :line_items do |li| %>
  <%= li.text_field :item_name %>
  <%= li.text_field  :quantity  %>
  <%= li.text_field  :price  %>
  <%= li.link_to_remove "Remove item" %>
<% end %>
<%= f.link_to_add "Add item", :line_items %>

Satu hal yang tidak boleh kita lupakan untuk Rails 4 adalah penggunaan strong_params, dan kita harus memasukan attributes line_items ke bagian ini di orders_controller.rb agar nested record dari line_items dapat tersimpan di database.

def order_params
 params.require(:order).permit(:order_number, :order_date,        :line_items_attributes => [:id, :item_name, :price, :_destroy])
end

Selamat mencoba dan Happy Coding