Ruby on Rails (RoR) là một web framework được viết bằng ngôn ngữ Ruby và tất cả các ứng dụng trong Rails sẽ được viết bằng Ruby. Ruby on Rails được tạo ra để hỗ trợ các lập trình viên việc phát triển các phần mềm nền web một cách nhanh nhất có thể. Rails framework tận dụng các đặc điểm của ngôn ngữ Ruby. Yukishiro Matzumoto viết ra ngôn ngữ này vào năm 1995, nó khá giống với các ngôn ngữ thông dịch khác như Perl, Eiffel, Python…. Ruby là ngôn ngữ script, định nghĩa kiểu động và là một ngôn ngữ hướng đối tượng, nó được thiết kế với một cú pháp trong sáng, tạo cảm giác dễ đọc, và viết code ngắn gọn nhất có thể đối người dùng, ví dụ như nó không cần dấu chấm phẩy khi kết thúc câu lệnh, không cần các dấu ngoặc đơn khi khai báo các phương thức, có những đoạn code thậm chí được viết giống như việc chúng ta viết tiếng anh vậy. Nó được thiết kế để lập trình ứng dụng web dễ dàng hơn bằng cách tạo ra các giả định về những thứ mà nhà phát triển muốn bắt đầu. Rails là một phần mềm kiểu độc đoán, tức là nó giả định rằng đây là cách tốt nhất để làm việc, và nó được thiết kế để khuyến khích cách làm đó – và trong một số trường hợp nó ngăn cản những lựa chọn thay thế.
Trang 1TRƯỜNG ĐẠI HỌC CÔNG NGHỆ - ĐHQGHN
CÁC VẤN ĐỀ HIỆN ĐẠI CỦA CÔNG NGHỆ PHẦN MỀM
RUBY ON RAILS
NGUYỄN NHẬT TÂN, NGUYỄN VĂN CƯỜNG, TRẦN MINH THẮNG26/11/2013
Trang 2Mục lục
1 Giới thiệu Ruby on Rails 4
1.1 Tại sao gọi là Ruby on Rails? 4
1.2 Một số Website dùng Ruby on Rails 4
1.3 Cài đặt Ruby on Rails 5
1.4 Công cụ phát triển 6
2 Đặc trưng của Ruby on Rails 6
2.1 Các đặc trưng cơ bản 6
2.2 Cấu trúc thư mục ứng dụng 7
2.3 Model – View – Controller 8
2.4 Model 8
2.5 View 8
2.6 Controller 9
3 Định tuyến trong Ruby on Rails 9
3.1 Giới thiệu 9
3.2 Path và URL Helper 10
3.3 Các tài nguyên lồng nhau 10
3.4 Tạo Path và URL từ Object 11
4 Active Record là gì? 12
5 Object Relational Mapping (ORM) 13
6 Active Record như là một ORM Framework 14
7 Quy ước về cấu hình trong Active Record 14
7.1 Quy ước đặt tên 14
7.2 Quy ước về lược đồ (schema) 15
Trang 38 Thao tác với Model 15
9 Console Rails 16
10 Cơ sở dữ liệu trong Rails 17
11 Quản lý Relation với Active Record 19
12 CRUD – đọc và ghi dữ liệu 21
12.1 Create 21
12.2 Read 21
12.3 Update 22
12.4 Delete 22
13 Active Record Migrations 22
14 Giới thiệu về Scaffolding 24
15 Đánh giá 24
16 Demo ứng dụng 26
16.1 Blog 26
16.2 Cửa hàng sách trực tuyến 26
Trang 41 Giới thiệu Ruby on Rails
1.1 Tại sao gọi là Ruby on Rails?
Ruby on Rails (RoR) là một web framework được viết bằng ngôn ngữ Ruby và tất
cả các ứng dụng trong Rails sẽ được viết bằng Ruby Ruby on Rails được tạo ra để
hỗ trợ các lập trình viên việc phát triển các phần mềm nền web một cách nhanh nhất có thể
Rails framework tận dụng các đặc điểm của ngôn ngữ Ruby Yukishiro Matzumoto viết ra ngôn ngữ này vào năm 1995, nó khá giống với các ngôn ngữ thông dịch khác như Perl, Eiffel, Python… Ruby là ngôn ngữ script, định nghĩa kiểu động và
là một ngôn ngữ hướng đối tượng, nó được thiết kế với một cú pháp trong sáng, tạo cảm giác dễ đọc, và viết code ngắn gọn nhất có thể đối người dùng, ví dụ như nó không cần dấu chấm phẩy khi kết thúc câu lệnh, không cần các dấu ngoặc đơn khi khai báo các phương thức, có những đoạn code thậm chí được viết giống như việc chúng ta viết tiếng anh vậy
Nó được thiết kế để lập trình ứng dụng web dễ dàng hơn bằng cách tạo ra các giả định về những thứ mà nhà phát triển muốn bắt đầu Rails là một phần mềm kiểu độc đoán, tức là nó giả định rằng đây là cách tốt nhất để làm việc, và nó được thiết
kế để khuyến khích cách làm đó – và trong một số trường hợp nó ngăn cản những lựa chọn thay thế
1.2 Một số Website dùng Ruby on Rails
Github.com: Hệ thống quản lý source phân tán, được nhiều công ty lớn sử dụng,
và có hàng triệu người đang sử dụng trang web này như một nơi lưu trữ các dự án của họ
Basecamp.com: website quản lý dự án online, ra đời vào năm 2004, cho đến năm
2012 đã có hơn 8 triệu dự án được quản lý trên website này
Twitter.com: là trang mạng xã hội lớn thứ 2 sau facebook, rất được sử dụng phổ
biến tại Mĩ và các nước châu Âu
Scibd.com: đây là trang web chia sẻ tài liệu trực tuyến lớn và nổi tiếng, có rất
nhiều tài liệu hay và miễn phí được chia sẻ tại đây
Trang 5Và một số website khác cũng nổi tiếng như hulu.com, hay slideshare.com, và
nhiều trang web khác
1.3 Cài đặt Ruby on Rails
Bình thường để cài đặt Ruby on Rails bản phải cài đặt tất cả các phần sau:
Giải pháp đơn giản và nhanh chóng dành cho bạn là dùng gói cài đặt có đầy đủ tất
cả các thành phần cần thiết, chỉ việc cài đặt nó và bắt đầu xây dựng một ứng dụng ROR: railsintaller.org, nó đã bao gồm những phần sau:
Trang 61.4 Công cụ phát triển
Sublime Text: là một editor có giao diện rất thân thiện cũng như thông minh, hỗ
trợ lập trình rất nhiều ngôn ngữ trong đó có Ruby (recommended)
JetBrains RubyMine: là một IDE đầy đủ tuy nhiên hơi nặng và cồng kềnh, hơn
một nửa cộng đồng Rails sử dụng nó, có bản FREE cho mục đích giáo dục hoặc các dự án mã nguồn mở
NetBeans: là một IDE quá nổi tiếng, hỗ trợ hầu như tất cả các ngôn ngữ cho các
dự án khác nhau, bạn chỉ cần cài plug-in cho Ruby on Rails để có thể bắt đầu phát triển ứng dụng
Aptana Studio: là một IDE đầy đủ các công cụ để phát triển Ruby on Rails, bạn
có thể cài đặt phiên bản standalone hoặc plug-in cho Eclipse
Ngoài ra còn rất nhiều editor và IDE khác cho các môi trường khác nhau như Linux, Windows, Mac
2 Đặc trưng của Ruby on Rails
2.1 Các đặc trưng cơ bản
DRY – “Don’t Repeat Yourself” – không khuyến khích viết đi viết lại mã
COC - Convention Over Configuration – Rails tạo những giả định về những gì bạn muốn làm và bạn sẽ làm, thay vì bạn phải chỉ định tất cả mọi thứ qua những file cấu hình
Tạo ra các giả định về những thứ mà nhà phát triển muốn bắt đầu, độc đoán, giả định đó là cách tốt nhất để làm việc
Ví dụ:
Rails đã định nghĩa sẵn thư mục mà bạn sẽ đặt stylesheets, images (/public), cũng như các file JavaScript (/script) để nó có thể biên dịch chúng thành các file cached Đây là một tính năng tuyệt vời nếu bạn có nhiều tài nguyên JavaScript để quản lý, nhưng hơi thừa nếu bạn làm việc với các ứng dụng nhỏ
Trang 7Khi bạn tạo một ứng dụng Rails mới, nó tự động tạo khoảng 10 thư mục cấp cao với một số thư mục con, và tất cả các file rb cũng được tạo sẵn Nó cũng giả sử
rằng bạn cần một database Điều đó chính là Convention Nó có vẻ hơi phức tạp
nếu bạn chỉ xây dựng những site nhỏ nhưng đối với các site lớn thì sẽ rất tiện lợi
2.2 Cấu trúc thư mục ứng dụng
app/ Chứa các controllers, models, views, helpers, mailers và assets của ứng dụng.
script/ Chứa rails script để khởi động ứng dụng, và các script khác để triển khai hoặc chạy ứng dụng.config/ Cấu hình runtime rules, routes, database
config.ru Cấu hình rack cho server được dùng để khởi động ứng dụng.db/ Chứa các database chema, migration hiện tại
public/ Chứa các file tĩnh và các asset được biên dịch
Rakefile Xác định vị trí và nạp các nhiệm vụ có thể chạy từ cmd
Trang 8File/Folder Purpose
Nên thêm các task vào thư mục lib/tasks thay vì thay đổi Rakefile
RECOMMENTME.rdoc File giới thiệu ứng dụng của bạn, cách cài đặt
tmp/ Các file tạm thời (cache, pid, session)
vendor/ Mã nguồn của bên thứ 3
2.3 Model – View – Controller
RoR sử dụng các mẫu kiến trúc Model – View – Controller(MVC) để tăng cường khả năng bảo trì và phát triển của ứng dụng MVC cho phép chúng ta chia ứng dụng thành các tầng sử lý logic, nghiệp vụ và giao diện người dùng một cách rõ ràng, điều này cũng gúp cho việc kiểm thử và tái sử dụng code được dễ ràng hơn
2.4 Model
Tầng Model xử lý các nghiệp vụ của ứng dụng và trực tiếp thao tác với dữ liệu Trong RoR, tầng model thường được sử dụng để tương tác với các thành phần tương ứng với chúng trong cơ sở dữ liệu và validate dữ liệu
2.5 View
Tầng view hiển thị giao diện người dùng, trong RoR các view là các file HTML được nhúng cùng với các đoạn mã Ruby Các đoạn mã Ruby được nhúng trong HTML file là khá đơn giản, thường chỉ gồm các vòng lặp và các lệnh điều kiện rẽ nhánh, nó được sử dụng để hiện thị dữ liệu lên form của view
Trang 92.6 Controller
Controller tương tác với model và view Các request đến từ trình duyệt sẽ được xử
lý bởi controller, sau đó controller có thể sẽ tương tác với model để lấy dữ liệu sau
đó trả về cho view để hiển thị thông tin
3 Định tuyến trong Ruby on Rails
3.1 Giới thiệu
Được định nghĩa trong file routes.rb
Một định tuyến cung cấp ánh xạ giữa các HTTP verbs (GET, POST, PATCH/PUT, DELETE) và các URL đến các hành động (trong controller)
Theo quy ước mỗi hành động cũng ánh xạ đến từng CRUD (CREATE, READ, UPDATE, DELETE) trong database
Ví dụ:
resources :posts trong routes.rb tạo ra 7 tuyến đường khác nhau trong ứng dụng,
tất cả đều ánh xạ tới Posts Controller
Nếu Rails không tìm thấy posts/new template, nó sẽ gọi một template có tên là
application/new (Vì PostsController kế thừa từ ApplicationController)
HTTP Verb Path Action Used for
GET /posts index hiển thị danh sách post
GET /posts/new New/ trả về HTML form để tạo post mớiPOST /posts create Tạo một post mới
GET /posts/:id show Hiện thị một post
GET /posts/:id/edit edit Trả về HTML form để edit post
PATCH/PUT /posts/:id update Update một post
DELETE /posts/:id destroy Xóa một post
Trang 103.2 Path và URL Helper
Để tạo ra một route cần dùng đến một số helper
Đối với resource :posts
posts_path trả về /posts
new_post trả về /posts/new
edit_post_path(:id) trả về /posts/:id/edit
post_path(:id) trả về /posts/:id
Mỗi helper có một _url helper tương ứng (ví dụ post_url) trả về đường dẫn hiện tại
3.3 Các tài nguyên lồng nhau
Thường có những tài nguyên là con của tài nguyên khác Ví dụ, ứng dụng của bạn
Trang 11Ngoài định tuyến cho posts, khai báo trên cũng định tuyến comments đến
CommentsController
Các URL của comment gửi yêu cầu đến post:
GET /posts/:post_id/comments index Hiển thị tất cả comment của một post
GET /posts/:post_id/comments/new new
trả về một form HTML
để tạo comment của một post nhất địnhPOST /posts/:post_id/comments create tạo một comment thuộc một post nhất định
GET /posts/:post_id/comments/:id show
hiển thị một comment thuộc một post nhất định
GET /posts/:post_id/comments/:id/edit edit
trả về một form HTML
để edit một comment thuộc một post nhất định
PATCH/PU
T /posts/:post_id/comments/:id update
update một comment nhất định thuộc một post nhất định
DELETE /posts/:post_id/comments/:id destroy
xóa một comment nhất định thuộc một post nhất định
3.4 Tạo Path và URL từ Object
Rails có thể tạo đường dẫn và URL từ một mảng các tham số Ví dụ, bạn có route sau:
Trang 12resources :posts do
resources :comments
end
Khi sử dụng post_comment_path, bạn có thể truyền vào một instance của Post và
Comment thay vì ID:
<%= link_to ‘Comment details’, post_comment_path(@post, @comment) %>
Bạn cũng có thể sử dụng url_for với một bộ object, và Rails sẽ tự động xác định
bạn muốn route nào:
<%= link_to ‘Comment details’ , url_for([@post, @comment]) %>
Trong trường hợp này Rails sẽ xem @post là một Post và @comment là một
Comment, vì thế nó sẽ sử dụng post_comment_path helper.
Đối với những hành động khác, chỉ cần thêm action làm phần tử đầu tiên của
Active Record trong mô hình MVC: là tầng Model của hệ thống, chịu trách nhiệm đại diện cho business data và logic Nó thuận tiện cho việc tạo và sử dụng các business object được lưu trữ trong DB Là 1 sự bổ sung cho Active Record Pattern
Trong Active Record , các đối tượng mang cả dữ liệu và hành vi hoạt động trên
dữ liệu đó, đảm bảo việc truy cập dữ liệu 1 cách logic, là một phần của đối tượng sẽ dạy cho người dùng làm thế nào để đọc và ghi dữ liệu trong DB Vì thế, Active Record được xem như là một công cụ mạnh mẽ và hữu dụng Thông
Trang 13Key khi xây dựng DB, việc liên kết các bảng cũng có Active Record trợ giúp Khi có sự thay đổi, ta không cần phải thao tác với SQL mà chỉ cần thông qua ngôn ngữ Ruby.
5 Object Relational Mapping (ORM)
ORM là cơ chế cho phép bạn xây dựng 1 ứng dụng (cụ thể là OOP-hướng đối tượng) mà thao tác trên table trong database được đóng gói lại trong 1 business class (vd: table Users tương ứng với class User), và không phải quan tâm nhiều đến việc viết query cho mỗi lần truy xuất DB Kỹ thuật ORM thích hợp trong môi trường phát triển một hệ thống website mà trong đó cần tham gia nhiều thành viên trong nhóm code và cho các hệ thống quy mô Enterprise
Với ORM, bạn có thể sử dụng với nhiều hệ quản trị cơ sở dữ liệu khác nhau,
nó độc lập hoàn toàn, và thường các ORM trên thị trường hiện nay đều hỗ trợ nhiều hệ quản trị cơ sở dữ liệu khác nhau, bạn chỉ cần thay đổi driver tương tác
là có thể làm việc một cách nhanh chóng mà không cần phải thay đổi bất kỳ dòng code nào
Một thế mạnh nữa của ORM, là bạn có thể thao tác truy cập, xử lý database một cách dễ dàng và nhanh chóng So với cách thông thường bạn phải sử dụng các câu lệnh SQL để truy vấn và xử lý dữ liệu Nhưng với ORM, bạn không
Trang 14cần phải sử dụng SQL, mà chỉ cần thao tách, sử dụng các API đơn giản và dễ dùng của nó để truy vấn và dữ lý dữ liệu
Với ORM Framework, bạn không cần dùng SQL để thao tác dữ liệu, vậy thì làm sao để nó làm việc với database? Đó là do nó tự động gen ra các câu lệnh SQL như Insert, Update, Delete, Select dữ liệu bên dưới database, nên bạn sẽ khó hoặc có thể không can thiệp vào để tối ưu nó hơn Tuy nhiên các ORM Framework đều hỗ trợ bạn gọi câu lệnh SQL trực tiếp trong những tình huống cần thiết
Ngoài ra bạn còn phải gặp nhiều tình huống nan giải mà bất kì ai làm việc với ORM cũng phải gặp qua: cách thức quản lý session truy xuất của ORM – nếu bạn làm việc với Web project, lazy loading, tình huống load toàn bộ database lên nếu không thiết kế đúng cách… Và khi đó hệ thống của bạn sẽ làm việc một cách ì ạch
6 Active Record như là một ORM Framework
Active Record cung cấp cho chúng ta các cơ chế, quan trọng là khả năng:
• Đại diện cho model và dữ liệu của chúng
• Đại diện cho sự liên kết giữa các model
• Đại diện cho các phân cấp kế thừa thông qua mô hình quan hệ
• Kiểm tra tính hợp lệ của của model trước khi chúng tồn tại trong DB
• Thực hiện các hoạt động cơ sở dữ liệu một cách hướng đối tượng
7 Quy ước về cấu hình trong Active Record
7.1 Quy ước đặt tên
Active Record sử dụng quy ước đặt tên để tìm hiểu cách thức ánh xạ giữa các models và các bảng DB:
- Tên bảng là dạng số nhiều của tên model
- Nếu tên model bao gồm nhiều từ (viết hoa ký tự đầu tiên của mỗi từ) thì tên bảng tương ứng sẽ chứa các từ được cách nhau bởi dấu gạch dưới
Ví dụ:
Trang 15Model / Class Table / Schema
7.2 Quy ước về lược đồ (schema)
Active Record sử dụng quy ước đặt tên các cột trong bảng cơ sở dữ liệu tùy thuộc vào mục đích của những cột này
Foreign Key: cột này được đặt tên theo mô hình Active Record sử dụng cột
này để tạo ra các liên kết giữa các bảng trong DB
Primary Key: mặc định Active Record sẽ sử dụng một cột số nguyên tên là
ID là khóa chính của bảng Khi sử dụng Active Record Migration để tạo ra các bảng, cột này sẽ được tự động tạo ra
Ngoài ra còn một số tên cột tùy chọn sẽ thêm các tính năng của Active Record:
Create_at: tự động thiết lập ngày và thời gian hiện tại khi một bản ghi được
ghi lần đầu tiên
Update_at: tự động thiết lập ngày và thời gian hiện tại khi một bản ghi được
cập nhật
8 Thao tác với Model
Chúng ta sẽ cần sử dụng đến Object của model Active Record Để tạo ra một model, ta sử dụng dòng lệnh trong cmd:
rails generate model Product
Rails sẽ tự động tạo ra cho ta một Object của model trong
app/models/product.rb.
Lúc này, nếu sử dụng chức năng tích hợp sẵn của Schema Migration thì ta sẽ không cần sử dụng scrip SQL mà sẽ làm việc độc lập giữa DB và Schema, làm
Trang 16giảm thiểu thao tác với DB mà không làm mất dữ liệu sau mỗi lần thay đổi Schema.
Để sử dụng Schema Migration, ta thay đổi nội dung tập tin
Để thực thi gõ câu lệnh: rake db:migrate
Active Record sẽ khởi tạo 2 table: schema_info và products Trong table
schema_info sẽ ghi lại verson của tập tin migration giúp quản lý các mã đã tạo
đồng thời vẫn giữ được thông tin đã lưu
9 Console Rails
Là một tiện ích đi kèm với mỗi ứng dụng Rails, cho phép làm việc với các model được liên kết với DB Khi khởi động console, Rails sẽ thực hiện các bước:
• Rails liên kết với DB
• Rails tải các class Active Record trong app/model
• Rails cho phép thao tác với model
Để khởi động Rails console, sử dụng lệnh: rails console
Thêm thông tin vào CSDL: