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.

Tidak ada komentar:

Posting Komentar