21 Sep 2017

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

    Tiada ulasan:

    Catat Ulasan

    Demo sero guano?