Assalamualaikum
Versi TLDR;
1. Dapatkan nama:jenis_data dari model dari rails console2.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)>
$\> 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| %>
<% 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 %>
Kesimpulan
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
Catat Ulasan
Comment