Posts Tagged ‘ruby on rails’

rubyonrails_shaped.sh-600x6002 tahun berlalu setelah terakhir posting di blog ini. 2 tahun berlalu jg jari mengetik dan mata melihat baris baris kode Ruby serta framework Ruby on Rails. Sekarang ada tugas negara untuk kembali belajar Ruby on Rails ini. Aplikasi yang saya buat mengharuskan untuk membuat database lebih dari satu. Biasanya hal seperti ini digunakan saat kita akan memisahkan suatu keperluan. Sebagai contoh database transaksi kita pisahkan dengan database report dan juga kita pisahkan lagi dengan database log/audit trail.

Setelah mencoba beberapa teknik, berikut sedikit trik untuk membuat konfigurasi multiple database pada Ruby on Rails, dengan fungsi migration juga pada semua konfigurasi.

  1. Buat sebuah file konfig database “.yml” pada folder config, sebagai contoh, disini dibuat file dengan nama “database_a2m.yml” dengan konfigurasi sama dengan file database.yml default bawaan rails.
  2. Buat sebuah file dengan nama “db_a2m.rb” pada folder “config/initializers/”, dan ketikkan baris kode berikut :
    DB_A2M = YAML::load(ERB.new(File.read(Rails.root.join("config","database_a2m.yml"))).result)[Rails.env]
  3. Jika di configuration ruby default terdapat folder “db” di root folder, maka kita menambahkan sebuah folder untuk database baru, sebagai contoh saya menambahkan folder dengan nama “db_a2m”.screen-shot-2017-01-11-at-11-11-20-am
  4. Copy isi direktori db ke folder db_a2m, sehingga struktur direktori app kita sebagai berikut.screen-shot-2017-01-11-at-11-13-26-am
  5. Buat sebuah file dengan nama db_a2m.rake dan letakkan pada folder “lib/tasks/”. Dan ketikkan baris kode berikut pada file tersebut :
    task spec: ["a2m:db:test:prepare"]
    
    namespace :a2m do
    
      namespace :db do |ns|
    
        task :drop do
          Rake::Task["db:drop"].invoke
        end
    
        task :create do
          Rake::Task["db:create"].invoke
        end
    
        task :setup do
          Rake::Task["db:setup"].invoke
        end
    
        task :migrate do
          Rake::Task["db:migrate"].invoke
        end
    
        task :rollback do
          Rake::Task["db:rollback"].invoke
        end
    
        task :seed do
          Rake::Task["db:seed"].invoke
        end
    
        task :version do
          Rake::Task["db:version"].invoke
        end
    
        namespace :schema do
          task :load do
            Rake::Task["db:schema:load"].invoke
          end
    
          task :dump do
            Rake::Task["db:schema:dump"].invoke
          end
        end
    
        namespace :test do
          task :prepare do
            Rake::Task["db:test:prepare"].invoke
          end
        end
    
        # append and prepend proper tasks to all the tasks defined here above
        ns.tasks.each do |task|
          task.enhance ["a2m:set_custom_config"] do
            Rake::Task["a2m:revert_to_original_config"].invoke
          end
        end
      end
    
      task :set_custom_config do
        # save current vars
        @original_config = {
            env_schema: ENV['SCHEMA'],
            config: Rails.application.config.dup
        }
    
        # set config variables for custom database
        ENV['SCHEMA'] = "db_a2m/schema.rb"
        Rails.application.config.paths['db'] = ["db_a2m"]
        Rails.application.config.paths['db/migrate'] = ["db_a2m/migrate"]
        Rails.application.config.paths['db/seeds'] = ["db_a2m/seeds.rb"]
        Rails.application.config.paths['config/database'] = ["config/database_a2m.yml"]
      end
    
      task :revert_to_original_config do
        # reset config variables to original values
        ENV['SCHEMA'] = @original_config[:env_schema]
        Rails.application.config = @original_config[:config]
      end
    end
  6. Untuk menjalankan database migration gunakan perintah berikut : rails a2m:db:migrate
  7. Sesuaikan dengan nama konfigurasi.
  8. Restart server dan sekarang sudah bisa menggunakan konfigurasi multiple database dengan menambahkan baris kode :
    "establish_connection DB_A2M"  pada file model.screen-shot-2017-01-11-at-11-24-06-am

rubyonrails_shaped.sh-600x600Disaat kita membuat sebuat aplikasi yang besar, kompleks, banyak menu dan atau modul, akan sangat menyusahkan jika dalam meletakkan model-view-controller kita default sesuai dengan standard framework yang kita gunakan.

Dalam kasus ini yakni ruby on rails, secara default meletakkan file model-view-controller pada folder app/.

Custom sederhana pada path rails akan lebih mudah dalam pengkelompokan modul modul (modular) atau seperti HMVC (Hierarchial Model View Controller), namun hanya perlu config sederhana, tanpa perli menambahkan sebuah class third party. Config nya hanya seperti ini Om.

  1. Buat sebuah folder dengan nama modules di dalam direktori app/. *nama folder bisa disesuaikan.
  2. Config di bagian config/application.rb dan tambahkan kode baris berikut untuk bisa load path controller dan view pada folder app/modules/. 
    config.autoload_paths += Dir["#{config.root}/app/modules/**/**/**/"]
    
  3. Kemudian untuk load path view edit file app/controllers/application_controller.rb  ,dan tambahkan baris berikut :

    before_filter :set_view_path
    def set_view_path
       prepend_view_path Dir["#{Rails.root}/app/modules/**/**"]
    end
    
  4. Dan selanjutnya struktur mvc nya sebagai berikut :

    ss_hmvc_rails

    struktur modular

  5. Pindahkan file models, views dan controllers ke dalam folder modules.

Kali ini langkah langkah membuat modular ruby on rails ini saya diajarin dengan orang yang namanya Mas Udin. Demikian konfigurasi sederhana yang bisa diterapkan dalam framework ruby on rails, semoga bermanfaat.