Chúng ta sẽ xây dựng một website bán hàng đơn giản, sử dụng cơ sở dữ liệu là SQLite3
SQLite3
SQLite3 là một cơ sở dữ liệu SQL, đặc điểm của SQLite3 là rất nhỏ, nhẹ, dễ cài đặt, phù hợp với nhiều loại ứng dụng. Điểm đặc biệt của SQLite3 là chúng ta không cần một server, không cần các bước cài đặt phức tạp, rườm rà.
Nếu bạn đã có trình sqlite3.exe trên máy thì bạn có thể bỏ qua phần này và kéo xuống phần tạo cơ sở dữ liệu để đọc tiếp. Nếu chưa thì đầu tiên bạn tải công cụ của sqlite3 tại địa chỉ https://sqlite.org/download.html
Bạn tải các tool về và giải nén theo hệ điều hành mà bạn đang dùng, chẳng hạn như bạn dùng Windows thì tải file sqlite-tools-win32-x86-3140200.zip (1.52 MiB) về:
Tiếp theo bạn nên (hoặc phải) đưa đường dẫn đến thư mục chứa các file vừa được giải nén này vào biến môi trường PATH để tiện sử dụng sau này:
Ví dụ với Windows 10:
Bạn bấm chuột phải vào My Computer → Properties → Advanced system settings → Environment Variables, sau đó click chọn biến Path trong phần System variables rồi chèn thêm đường dẫn đến thư mục sqlite3 vừa giải nén vào. Chẳng hạn ở đây mình giải nén vào thư mục F:\DevSoft\sqlite3 thì mình có hình như sau:
Bây giờ chúng ta kiểm tra xem sqlite3 đã được đưa vào biến môi trường Path chưa thì bạn mở terminal lên (Cmd trong Windows) rồi gõ lệnh sqlite3 -version
để xem phiên bản sqlite3.
Nếu bạn ra được giống như hình trên thì đường dẫn đến thư mục chứa sqlite3 của bạn đã hoàn toàn nằm trong biến môi trường Path rồi. Ở đây mình dùng SQLite3 phiên bản 3.14.2 như trong hình.
Tạo project
Chúng ta tạo project với tên là depot (nghĩa là nhà kho).
C:\Projects\Rails>rails new depot ...
Tiếp theo chúng ta sẽ tạo CSDL. Chúng ta chuyển thư mục trong cmd vào thư mục của project (bằng lệnh cd) và gõ lệnh sau:
C:\Project\Rails\depot>rails generate scaffold Product title:string description:text image_url:string price:decimal invoke active_record create db/migrate/20161106144824_create_products.rb create app/models/product.rb invoke test_unit create test/models/product_test.rb ...
Lệnh trên có cú pháp như sau:
rails generate scaffold <tên bảng> <tên trường 1:kiểu dữ liệu> <tên trường 2:kiểu dữ liệu>...<tên trường n:kiểu dữ liệu>
Lệnh này sẽ định nghĩa các model để tạo CSDL, ở đây chúng ta tạo model Product
(sản phẩm) với các trường title, description, image_url, price.
Tuy nhiên lệnh này chưa tạo bảng và model ngay mà chỉ tạo một thư mục có tên migrate
trong thư mục db
và một file có có tên tương tự như 20161106144824_create_products.rb
trong thư mục đó, file này sẽ lưu thông tin của các bảng sẽ được tạo sau này:
class CreateProducts < ActiveRecord::Migration def change create_table :products do |t| t.string :title t.text :description t.string :image_url t.decimal :price t.timestamps null: false end end end
Chúng ta sửa lại file này để quy định trường price
có độ lớn 8 chữ số và số phần thập phân là 2 chữ số như sau:
class CreateProducts < ActiveRecord::Migration def change create_table :products do |t| t.string :title t.text :description t.string :image_url t.decimal :price, :precision => 8, :scale => 2 t.timestamps null: false end end end
Tiếp theo để thực sự tạo CSDL và tạo bảng thì chúng ta chạy lệnh rake db:migrate
như sau:
C:\Project\Rails\depot>rake db:migrate == 20161106144824 CreateProducts: migrating =========================================== -- create_table(:products) -> 0.0041s == 20161106144824 CreateProducts: migrated (0.0066s)===================================
Lệnh này sẽ tạo CSDL, mặc định Rails sử dụng cơ sở dữ liệu SQLite3 và file chứa CSDL sẽ nằm trong thư mục db
và có tên là development.sqlite3
. Bạn có thể cấu hình để Rails sử dụng CSDL khác hoặc đổi tên file CSDL mặc định thành tên khác bằng cách chỉnh sửa trong file database.yml
trong thư mục config.
Cách cấu hình thì mình sẽ nói ở bài khác.
Model mà chúng ta đã tạo bằng lệnh rails generate scaffold
có tên là Product,
tuy nhiên Rails sẽ tự động chuyển tên model thành viết thường và thêm ký tự ‘s‘ vào cuối tên và dùng tên đó để tạo bảng, tức là ở đây bảng của chúng ta sẽ có tên là products
. Một điều khác nữa là Rails sẽ tự động thêm trường id
có kiểu dữ liệu là INTEGER
tự động tăng và dùng trường này làm khóa chính, và tạo 2 trường created_at
và updated_at
có kiểu dữ liệu DATETIME
dùng để lưu thời điểm tạo bản ghi, thời điểm cập nhật bản ghi.
Ngoài việc tạo CSDL, Rails cũng sẽ tạo luôn model, controller và một số view mẫu để chúng ta sử dụng. Bây giờ chúng ta chạy server bằng lệnh rails server
sau đó trỏ đến địa chỉ localhost:3000/products
là sẽ được trang có hình như sau:
Bạn có thể thực hiện các thao tác thêm (click vào link New Product), sửa, xóa, cập nhật sản phẩm một cách dễ dàng, tất cả các thao tác cơ bản này đều do Rails tạo ra tự động.
Khi click vào đường dẫn New Product, bạn sẽ được chuyển đến trang http://localhost:3000/products/new,
trang này có giao diện được dựng từ file app/views/products/_form.html.erb,
chúng ta có thể tùy ý chỉnh sửa để giao diện hiển thị theo ý chúng ta, ở đây chúng ta sửa file này để hiển thị số dòng trong trường description
là 6 dòng như sau:
<%= form_for(@product) do |f| %> <% if @product.errors.any? %> <div id="error_explanation"> <h2><%= pluralize(@product.errors.count, "error") %> prohibited this product from being saved:</h2> <ul> <% @product.errors.full_messages.each do |message| %> <li><%= message %></li> <% end %> </ul> </div> <% end %> <div class="field"> <%= f.label :title %><br> <%= f.text_field :title %> </div> <div class="field"> <%= f.label :description %><br> <%= f.text_area :description, :rows => 6 %> </div> <div class="field"> <%= f.label :image_url %><br> <%= f.text_field :image_url %> </div> <div class="field"> <%= f.label :price %><br> <%= f.text_field :price %> </div> <div class="actions"> <%= f.submit %> </div> <% end %>
Save lại file này, sau đó refresh lại trang products/new,
bạn có thể tự tạo một sản phẩm (hay 1 bản ghi) mẫu nào đó.
Bạn sẽ nhận được thông báo sản phẩm được tạo thành công. Bây giờ bạn có thể quay lại trang /products
và sản phẩm sẽ được hiển thị lên.
Ngoài ra bạn sẽ thấy còn có 3 đường link là Show, Edit được route với các trang /products/<id>, /products/<id>/edit
dùng để hiển thị thông tin chi tiết sản phẩm và chỉnh sửa sản phẩm. Đường link Destroy sẽ hiển thị một hộp thông báo hỏi chúng ta có muốn xóa sản phẩm không, nếu bấm OK thì sản phẩm đó sẽ bị xóa.
Các chức năng thêm, sửa, xóa, cập nhật được gọi chung là thao tác CRUD (Create – Read – Update – Delete), hầu hết mọi ứng dụng quản lý (như quản lý cửa hàng, quản lý khách sạn, quản lý sinh viên…v.v) đều phải code các chức năng này. Vậy nên Rails đã hỗ trợ chúng ta bằng cách tạo sẵn các thao tác này, do đó phần việc của chúng ta được tinh giảm đi rất nhiều. Việc cần làm còn lại chỉ là chỉnh sửa giao diện, thêm các chức năng đặc thù như phân quyền, xác thực, bảo mật…v.v