Rails – Xây dựng ứng dụng MVC

4.8/5 - (12 votes)

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ề:

capture

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:

capture

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.

capture

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_atupdated_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:

capture

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 đó.

capture

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.

capture

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

0 0 votes
Article Rating
Subscribe
Thông báo cho tôi qua email khi
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Inline Feedbacks
View all comments