Rabu, 30 Oktober 2024

Ransack pada ruby on rails

Ransack 

 adalah gem Ruby yang memungkinkan pencarian dan pemfilteran data pada model Active Record dengan sangat fleksibel dan mudah. Ini sangat berguna dalam aplikasi Ruby on Rails yang membutuhkan fitur pencarian atau penyaringan data berdasarkan kolom tertentu.

pertama kita harus memasukan gem 'ransack' pada Gemfile

gem 'ransack', '~> 4.2.1'
langkah selanjutnya kita harus membuat controller , contohnya Class User seperti dibawah
class UsersController < ApplicationController
  def index 
    @q = User.ransack(params[:q])
    @users = @q.result(distinct: true)
  end
end
setelah itu, kita harus buat tampilan di app/views/users/index.html.erb seperti contoh dibawah :
<%= search_form_for @q, url: users_path, method: :get do |f| %>
  
<%= f.label :name_cont, "Nama" %><%= f.search_field :name_cont %>
<%= f.label :age_cont, "Usia" %><%= f.search_field :age_cont %>
<%= f.label :email_cont, "Email" %><%= f.search_field :email_cont %>
<%= f.submit "Cari" %><% end %>
masukan juga routes untuk /users di config/routes.rb
resources :users
Pada models user.rb, kita harus definisikan bahwa field yang ada dalam class model User di set self.ransackable_attributes , contohnya seperti ini

class User < ApplicationRecord
  def self.ransackable_attributes(auth_object = nil)
    ["age", "created_at", "email", "id", "name", "updated_at"]
  end
end
Berikut hasil nya :




 










Senin, 28 Oktober 2024

Membuat Rails Service Object dengan Gem Light Service

 Service Object pada Ruby on Rails

Tutorial service object ini akan memisahkan bisnis logic dan logic aplikasi agar mudah di maintenance dan agar bisa scalabel

Apa itu  service object?

pola yang memungkinkan Anda memisahkan logika bisnis dan elemen lain dari kontroler dan model, yang memungkinkan model menjadi lapisan data dan kontroler menjadi titik masuk API.
Service object,disini kita akan membuat class yang akan bertanggung jawab terhadap logic bisnis saja  dan hanya akan ada 1 method public untuk satu task yang dikerjakan

kapan kita harus pake service object?

1. ada proses data yang kompleks atau butuh terhubung dulu ke external API, dengan ini kamu dapat encapsulasi komplex proses agar bisa di manage
2. bisnis rules yang komplex
3. butuh integrasi dengan third-party integrations

Langkah : 

Pertama kita akan buat folder di app/services

buat app/services/user_registration.rb  
class UserRegistration
  extend LightService::Organizer

  def self.call(params)
    with(params: params).reduce(
      ValidateUserInput,
      CreateUser
 )
  end

end

code ini akan handle membuat satu public method utk call calss UserRegistration dan akan menjalankan action ValidateUserInput, CreateUser

selanjutnya kita buat model User
rails g model User

selanjutnya buat class CreateUser.rb di app/services/user_registration/create_user.rb seperti ini 

class UserRegistration::CreateUser
  extend LightService::Action

  expects :validated_params
  promises :user

  executed do |context|
    user = User.new(context.validated_params)
   
    if user.save
    context.user = user
    else
    context.fail!(user.errors.full_messages.to_sentence)
    end
  end

end

class UserRegistration akan eksekusi pembuatan user 

lalu buat app/services/user_registration/validate_user_input.rb seperti dibawah ini : 

class UserRegistration::ValidateUserInput
  extend LightService::Action

  expects :params
  promises :validated_params

  executed do |context|
    if context.params[:email].blank?
      context.fail("Please Fill Email !! ")
    end

  context.validated_params = context.params
  end

end

class ValidateUserInput, akan melakukan validasi input jika email kosong

langkah terakhir kita bisa eksekusi service object nya seperti ini di rails console


result = UserRegistration.call(email: 'jaka@testdoterb.com', name: 'Jaka Pratama')









Seri Belajar Ruby on Rails - Introducing Rails 7

Rails menyediakan generator pemanggil script yang ditujukan untuk membuat proses pengembangan menjadi lebih mudah. Pada tutorial ini penulis menggunakan ruby versi rails 7.2.1 dengan ruby 3.1.4. Untuk menggunakan generator untuk membuat Rails project baru, lakukan perintah berikut :

  1. pertama kali kita harus install dulu ruby depedency nya
  2. install depedency yang dibutuhkan seperti dibawah 
    sudo apt-get update
    
    sudo apt-get install git-core zlib1g-dev
    build-essential libssl-dev libreadline-dev libyaml-dev
    libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev 
    libcurl4-openssl-dev software-properties-common 
    libffi-dev
  3. tutorial ini akan menggunakan ASDF, ASDF alat manajemen versi untuk berbagai bahasa pemrograman dan alat pengembang. Dengan asdf, Anda dapat mengelola berbagai versi alat seperti Python, Node.js, Ruby, Elixir, dan banyak lagi dalam satu sistem
  4. install asdf dengan langkah berikut, ,kemudian tambahkan ke terminal anda :
    git clone https://github.com/excid3/asdf.git ~/.asdf
    echo '. "$HOME/.asdf/asdf.sh"' >> ~/.bashrc
    echo '. "$HOME/.asdf/completions/asdf.bash"' >> ~/.bashrc
    echo 'legacy_version_file = yes' >> ~/.asdfrc
    echo 'export EDITOR="code --wait"' >> ~/.bashrc
    exec $SHELL
      
  5. berikut syntax yang bisa di gunakan untuk manage asdf
    asdf list all ruby --> check all candidate ruby version in asdf
    asdf global ruby 3.1.4 --> use ruby global
    asdf install ruby 3.1.4 --> install ruby specific version
    asdf list ruby --> check installed ruby version
  6. selanjutnya lakukan perintah ini untuk menginstall rails
    gem install rails -v 7.2.1
  7. jika sudah kita bisa cek versi rails
    rails -v
  8. kemudian buat aplikasi dengan perintah berikut :
    rails new rails7_app -d postgresql
  9. lalu masukan perintah ini jika ada error saat running server
    rake db:create
  10. jika issue sudah hilang, maka bisa menyalakan server local
    rails server
  11. jika berhasil maka akan menghasilkan seperti ini :

Struktur Code Aplikasi 

Berikut penjelasan struktur aplikasi yang ada di rails 7 : 


  1. app

models: Tempat untuk semua Model. Model berinteraksi dengan database dan berisi logika bisnis aplikasi. Biasanya setiap model merepresentasikan tabel dalam database.

            Contoh: app/models/user.rb (Model untuk entitas pengguna)

controllers: Tempat untuk semua Controller. Controller menangani permintaan dari browser, memprosesnya, dan merespon dengan menampilkan View yang sesuai.

            Contoh: app/controllers/users_controller.rb

views: Menyimpan semua View. View adalah template yang akan dikirimkan ke pengguna sebagai respons HTML (atau format lainnya). Rails 7 mendukung template berbasis HTML ERB, Haml, Slim, dan lainnya.

            Contoh: app/views/users/index.html.erb

helpers: Modul yang berisi metode-metode pembantu untuk View, seperti fungsi format tanggal atau pembuatan link dinamis.


javascript: Rails 7 menggunakan integrasi dengan Import Maps atau Webpacker untuk mengelola berkas JavaScript. Biasanya JavaScript untuk front-end ditempatkan di sini.

            Contoh: app/javascript/application.js

channels: Folder ini digunakan untuk ActionCable, yang digunakan untuk implementasi WebSockets dalam Rails, misalnya untuk aplikasi real-time seperti chat.


mailers/: Digunakan untuk mengelola template dan logika pengiriman email.


assets/: Berisi file statis seperti gambar, CSS, dan JavaScript. Rails 7 menggunakan konfigurasi yang lebih modern, dan file statis bisa dikelola dengan berbagai tool, termasuk Sprockets atau Webpack.


  1. config

routes.rb : Mendefinisikan semua rute URL yang tersedia dalam aplikasi, menghubungkannya dengan controller yang tepat.


environments : Terdapat konfigurasi terpisah untuk lingkungan development, test, dan production.


database.yml : Mengatur koneksi ke database.


  1. db

migrate/: Folder ini berisi migration file, yaitu file untuk membuat atau mengubah struktur database. Rails menggunakan ActiveRecord untuk manajemen migration, yang memungkinkan modifikasi database secara version-controlled.

            Contoh: db/migrate/20241007123456_create_users.rb

seeds.rb: File yang digunakan untuk memuat data awal atau contoh ke dalam database.


  1. lib

Folder ini biasanya berisi modul atau library yang digunakan secara global dalam aplikasi. Biasanya digunakan untuk code yang tidak cocok masuk ke dalam model, controller, atau helper.

  1. test/spec

Folder ini digunakan untuk menyimpan tes unit, tes fungsi, dan tes integrasi untuk aplikasi Rails.

  1. bin

Berisi script yang dapat dieksekusi, seperti rails, rake, dan script untuk proses server.

  1. Gemfile

File ini berisi daftar semua gem (library Ruby) yang diperlukan oleh aplikasi. Ketika menjalankan bundle install, gems ini akan diunduh dan dipasang.

  1. log

Semua log aplikasi tersimpan di sini, baik untuk development, test, atau production environment.

  1. public

Berisi file statis publik seperti gambar, favicon, atau file HTML statis yang dapat diakses langsung tanpa melalui controller.




Membuat Controller dan View

Sebuah project Rails, minimalnya harus memiliki sebuah controller dan sebuah view.

Untuk membuat controller dan view kita bisa memanfaatkan generator yang telah disediakan oleh Rails.

rails g controller Home index

  1. Ini artinya yang dilakukan generator Rails membuat controller home_controller.rb

  2. sedangkan pada view generator otomatis membuat folder baru pada bagian views dengan nama home

  1. jika ingin melakukan perubahan , kita bisa rubah di

            learn_rails_7/rails7_app/app/views/home/index.html.erb

  1. kemudian method route terletak di config/routes.rb

  2. Pada browser masukkan url http://localhost:3000/home/index pada web browser.