Langkau ke kandungan utama

Ruby on Rails: Jana `Controller` dan `View` mengikut `Model` sedia ada

Assalamualaikum


Versi TLDR;

1. Dapatkan nama:jenis_data dari model dari rails console

2.3.1 :003 > User.type_caster => #<ActiveRecord::TypeCaster::Map:0x000000052b6f88 @types=User(id: integer, nostaf: string, name: string, pengguna_id: integer, is_admin: boolean, is_active: boolean, created_by: integer, created_at: datetime, updated_at: datetime)>
2. jana scaffold dengan --skip


$\> rails generate scaffold User nostaf name is_active:boolean --skip

Situasi

Untuk memudahkan dan mempercepatkan pembinaan struktur pangkalan data dan jadual-jadual fizikal, lebih mudah untuk kita jana `Model` terlebih dahulu kita betul-betul yakin dan berpuas hati barulah kita jana `Controller` dan `View` untuk model tersebut.

Kenapa tidak boleh terus jana dengan scaffold semasa pertama kali jana untuk setiap model?

 1. Sebabnya, biasanya,  kita perlu banyak ubah, tambah dan kemaskini setiap model untuk dapatkan atribut yang tepat.

2. Perlu tentukan hubungan antara jadual atau 'table relationship' dalam pangkalan data

3. Perlu uji dan buktikan  setiap konsep dalam hubungan jadual (perlu uji setiap belongs_to, has_many dan has_many: through:)

4. Semai data (seed data)

dan lain-lain sebab yang akan menyebabkan setiap kali perubahan, akan menjadikan controller dan view kita lapuk berbanding model.

Dan adalah sangat kritikal kita perlu tahu, sebagai programmer yang pemalas, kami malas nak menaip dan membaiki banyak kali.


Contohnya seperti di bawah:


Katakan kita ada dua entiti iaitu User dan Department

yang mana, User duduk di bawah satu Department

User dan  Department ada atribut masing-masing seperti berikut;

User: noic, name, address, department_id
Department: name

Dan, katakan kita telahpun bina model-model ini dalam rails
$\> rails g model Department name
Running via Spring preloader in process 20379
      invoke  active_record
      create    db/migrate/20170921050009_create_departments.rb
      create    app/models/department.rb
      invoke    test_unit
      create      test/models/department_test.rb
      create      test/fixtures/departments.yml

$\> rails g model User noic name address department:referencesRunning via Spring preloader in process 20403      invoke  active_record      create    db/migrate/20170921050023_create_users.rb      create    app/models/user.rb      invoke    test_unit      create      test/models/user_test.rb      create      test/fixtures/users.yml


Oleh itu, membina hanya view dan controller sahaja tanpa membina semula model adalah seperti berikut

$\> rails g scaffold Department name --skip
Running via Spring preloader in process 20456
      invoke  active_record
   identical    db/migrate/20170921050009_create_departments.rb
   identical    app/models/department.rb
      invoke    test_unit
   identical      test/models/department_test.rb
   identical      test/fixtures/departments.yml
      invoke  resource_route
       route    resources :departments
      invoke  scaffold_controller
      create    app/controllers/departments_controller.rb
      invoke    erb
      create      app/views/departments
      create      app/views/departments/index.html.erb
      create      app/views/departments/edit.html.erb
      create      app/views/departments/show.html.erb
      create      app/views/departments/new.html.erb
      create      app/views/departments/_form.html.erb
      invoke    test_unit
      create      test/controllers/departments_controller_test.rb
      invoke    helper
      create      app/helpers/departments_helper.rb
      invoke      test_unit
      invoke    jbuilder
      create      app/views/departments/index.json.jbuilder
      create      app/views/departments/show.json.jbuilder
      create      app/views/departments/_department.json.jbuilder
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/departments.coffee
      invoke    scss
      create      app/assets/stylesheets/departments.scss
      invoke  scss
      create    app/assets/stylesheets/scaffolds.scss

$\> rails g scaffold User noic name address, department:references --skip


Perhatikan, dengan menambah pilihan --skip dalam arahan, rails tidak akan menulis semula fail yang telah sedia ada.


Jadual DB sedia ada 

Bagaimana untuk Jadual DB yang sudahpun dibina oleh sistem sebelum ini? Maksudnya kita menggunakan Ruby on Rails di atas sistem yang sudahpun siap dibina oleh orang lain?
Kita boleh lakukan seperti ini:

Mula-mula sekali, dapatkan nama-nama lajur berdasarkan jadual DB, janakan scaffold anda seperti di bawah dengan menambah pilihan "--migration=false"

$\> rails g scaffold Pengguna noic nama alamat emel notelefon --migration=false
Running via Spring preloader in process 21411
      invoke  active_record
      create    app/models/pengguna.rb
      invoke    test_unit
      create      test/models/pengguna_test.rb
      create      test/fixtures/penggunas.yml
      invoke  resource_route
       route    resources :penggunas
      invoke  scaffold_controller
      create    app/controllers/penggunas_controller.rb
      invoke    erb
      create      app/views/penggunas
      create      app/views/penggunas/index.html.erb
      create      app/views/penggunas/edit.html.erb
      create      app/views/penggunas/show.html.erb
      create      app/views/penggunas/new.html.erb
      create      app/views/penggunas/_form.html.erb
      invoke    test_unit
      create      test/controllers/penggunas_controller_test.rb
      invoke    helper
      create      app/helpers/penggunas_helper.rb
      invoke      test_unit
      invoke    jbuilder
      create      app/views/penggunas/index.json.jbuilder
      create      app/views/penggunas/show.json.jbuilder
      create      app/views/penggunas/_pengguna.json.jbuilder
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/penggunas.coffee
      invoke    scss
      create      app/assets/stylesheets/penggunas.scss
      invoke  scss
   identical    app/assets/stylesheets/scaffolds.scss


Rails akan membina semua fail yang diperlukan, dan, yang paling menarik adalah, borang yang dijana oleh rails akan mengikut atribut yang kita tulis semasa jana scaffold.

seperti dalam contoh di atas,  isikandungan fail app/views/penggunas/_form.html.erb adalah seperti berikut:


<%= form_for(@pengguna) do |f| %>

  <% if @pengguna.errors.any? %>
   
     

<%= pluralize(@pengguna.errors.count, "error") %> prohibited this pengguna from being saved:


     
          <% @pengguna.errors.full_messages.each do |message| %>
           


  • <%= message %>
  •       <% end %>
         
       
      <% end %>

     
        <%= f.label :noic %>
        <%= f.text_field :noic %>
     
     
        <%= f.label :nama %>
        <%= f.text_field :nama %>
     
     
        <%= f.label :alamat %>
        <%= f.text_field :alamat %>
     
     
        <%= f.label :emel %>
        <%= f.text_field :emel %>
     
     
        <%= f.label :notelefon %>
        <%= f.text_field :notelefon %>
     
     
        <%= f.submit %>
     
    <% end %>


    Perhatikan borang ini dijana mengikut apa yang kita setkan dan ianya dijana secara automatik. Ini akan menggembirakan orang yang malas menaip koding.

    Kesimpulan
    Oleh kerana kita malas, 

    Untuk mejimatkan masa kita dan mengelakkan kita daripada mengulangi kerja yang sama setiap kali perubahan pada model berlaku di awal pembangunan sistem, kita boleh bina dahulu model yang tepat dan menguji konsep tersebut tanpa perlu apa apa Controller dan View sehingga kita berpuas hati.

    Setelah itu, untuk mula membangunkan antaramuka pengguna dan aliran kerja sistem, barulah kita jana semua fail-fail tersebut secara automatik berdasarkan ciri-ciri model yang terkini.


    Selamat berkod


    Wassalamualaikum

    Ulasan

    Catatan popular daripada blog ini

    Apa Maksud RON dalam pengkelasan Petrol?

    RON dan Petrol Oleh yusdirman, Oktober 2014 RON adalah singkatan daripada Research Octane Number Ianya kaedah penarafan bahan api. Lebih tinggi nilai RON, lebih mahal harga PETROL. Adakah minyak RON 97 lebih berkuasa berbanding RON 95? RON merujuk kepada tahap bahan api menahan rintangan "ketukan" semasa proses pembakaran oleh palam pencucuh dalam enjin. Ianya merujuk kepada tahap ketahanan bahan api untuk tidak terbakar sebelum dinyalakan oleh palam pencucuh dalam enjin. "ketukan" dalam konteks RON ini adalah apabila campuran bahan api dan udara dalam enjin terbakar lebih awal sebelum api dari palam pencucuh menbakarnya. Pembakaran awal ini mungkin disebabkan enjin terlalu panas. Haba dari silinder enjin itu sendiri mungkin telah menyalakan bahan api sebelum palam pencucuh menyala. Ini boleh menurunkan prestasi dan mungkin boleh memudaratkan enjin! Jadi, RON bukannya bermaksud LEBIH KUASA! Ianya bermaksud bahan api itu dapat menahan tekanan dari

    Load Balancing dengan Nginx dan Puma

    Load Balancing dengan Nginx dan Puma Tutorial ini adalah sangat ringkas hanya untuk menunjukkan kebolehan nginx sebagai load balancer yang dapat menjadi 'orang tengah' antara banyak server di belakangnya Keperluan 1. Paling kurang 2 server aplikasi 2. Satu server diinstall nginx Contoh Persekitaran yang sekarang 1. server1: os: debian application: ruby on rails web server : puma dns : myaplication1.yusdirman.com 2. server2: myaplication2.yusdirman.com os:debian application: ruby on rails web server : puma dns : myaplication1.yusdirman.com 3. nginx diinstall di server1 /ets/nginx/nginx.conf setup (default): worker_processes  2; worker_processes  auto; worker_rlimit_nofile 65536; error_log  logs/error.log  notice; error_log  logs/error.log  info; events {   worker_connections  65536; } http {   include       mime.types;   default_type  application/octet-stream;   sendfile        on;   tcp_nopush on;   tcp_nodelay on;   keepalive_tim

    Server Redundancy - Pertindanan Komputer Pelayan

    alkisahnya tercari-cari untuk buat server redundancy ( pertindihan komputer pelayan ) atas sebab perlunya server yang sentiasa on-line tanpa ada downtime yang lama. Dan, cabarannya adalah memang kami tak pernah jalani apa-apa latihan, pengalaman dan apa jua pengetahuan berkenaan teknologi ini. Yang pastinya, perlu banyak mengoogle. Setakat ini, ada banyak kaedah untuk memastikan aplikasi masih terus boleh berfungsi walaupun server mati/rosak. 1. guna 2 server yang sama. Bila satu mati, satu lagi yang masih hidup dapat terus melayan pengguna. 2. guna 2 talian rangkaian yang berbeza. Bila satu talian rosak/putus, masih ada satu lagi talian rangkaian yang berfungsi. 3. storan di server guna raid ( redundant array of independent disk ) atau dalam bahasa melayu : barisan disk berlainan yang bertindan. Raid dapat menjadikan sebilangan hd menjadi 1 dengan semua data pada 1 hd adalah sama dengan data pada hd 2. (mirroring) 4. satu IP maya untuk sebilangan server. 2 server yang mena