Những tính năng mới có trên Rails 5
Mở đầu Rails 5 được công bố trên cộng đồng vào tháng 4-2015, theo như david.heinemeierhansson - người sáng lập ra Ruby on Rails đã chia sẻ thì trong phiên bản mới này có một số tính năng nổi bật và rất đáng được mong đợi. David cũng chia sẻ về tầm nhìn cũng như cách thức ông xây dựng framework ...
Mở đầu
Rails 5 được công bố trên cộng đồng vào tháng 4-2015, theo như david.heinemeierhansson - người sáng lập ra Ruby on Rails đã chia sẻ thì trong phiên bản mới này có một số tính năng nổi bật và rất đáng được mong đợi. David cũng chia sẻ về tầm nhìn cũng như cách thức ông xây dựng framework Ruby on Rails. Sự thật là những ứng dụng Web hiện tại không đơn thuần chỉ là những trang thuần HTML và CSS, web đang thay đổi và cùng với nó, Ruby on Rails cũng cần phải thay đổi để phù hợp với xu hướng. Hãy xem trong phiên bản mới này - Rails 5 đã thay đổi những gì.
Rails 5 chỉ hỗ trợ phiên bản Ruby 2.2.2 hoặc cao hơn
Rails 5 là phiên bản mới nhất của Ruby on Rails, điều đó cũng có nghĩa nó thừa hưởng những ưu điểm của những phiên bản trước, thêm mới Rails API cũng như cải thiện những APIs trước đó và tận dụng được những cập nhật của ngôn ngữ Ruby.
Vậy lí do gì khiến Rails 5 chỉ hỗ trợ các phiên bản Ruby 2.2.2 trở lên ?
Nguyên nhân quan trọng nhất chính là việc chúng ta thường xuyên sử dụng Symbols trong các ứng dụng Rails. Chính việc này khiến chúng ta phải đối mặt với nguy cơ của những cuộc tấn công DOS, khi mà các Symbols không được thu gom, hoặc tạo ra một lượng lớn Symbols sẽ khiến bộ nhớ của server bị quá tải, Ruby 2.2.2 đã thêm tính năng "Garbage Collection" để thu gom các Symbols này, đồng thời giúp giảm mức tiêu thụ bộ nhớ của các ứng dụng Rails.
Performance được cải thiện
Với Ruby 2.2.2, hiệu năng của Rails 5 được tăng lên đáng kể, ngốn ít tài nguyên bộ nhớ hơn. Tuy nhiên đó không phải là lý do duy nhất. Dường như đội ngũ phát triển đã trang bị cho phần lõi của Rails, biến nó trở thành 1 Framework nhanh và mạnh mẽ hơn. Từ việc giảm object allocations, freezing immutable strings, cho đến việc loại bỏ những dependencies không cần thiết và tối ưu hóa hệ thống đã khiến Rails 5 trở nên nhanh hơn.
Những điểm mới trong Rails 5
1. or method trong ActiveRecord::Relation
Cuối cùng ActiveRecord::Relation cũng hỗ trợ or method, giúp chúng ta có thể thực hiện queries theo cách sau:
Product.where('quantity = 1').or(Product.where('quantity = 3')) # => SELECT * FROM books WHERE (quantity = 1) OR (quantity = 3)
2. Quan hệ belongs_to được thiết lập là mặc định
Từ bây giờ, các ứng dụng Rails có thêm 1 tùy chọn cấu hình mới
config.active_record.belongs_to_required_by_default = true
Sẽ có thông báo lỗi khi quan hệ belongs_to không được thiết lập. Hoặc có thể thiết lập config.active_record.belongs_to_required_by_default = false và chèn thêm optinal trong model:
class Product < ActiveRecord::Base belongs_to :category, optional: true end
3.ActiveRecord’s attribute API
Tính năng mới này cho phép người dùng có thể ghi đè giá trị cho 1 thuộc tính của object cho dù kiểu dữ liệu là khác nhau. Ví dụ chúng ta có 1 trường trong cơ sở dữ liệu định nghĩa là số thập phân, nhưng trong ứng dụng lại chỉ cần quan tâm đến phần nguyên của số. Giờ đây với Rails 5 điều này thật đơn giản:
class Product < ActiveRecord::Base end book.quantity # => 12.0 class Product < ActiveRecord::Base attribute :quantity, :integer end product.quantity # => 12
4. has_secure_token được đẩy vào ActiveRecord
Giờ đây một ActiveRecord model có thể dễ dàng sử dùng token attributes. Ví dụ như việc tạo ra một chuỗi invitation token hoặc password reset token:
class Invite < ActiveRecord::Base has_secure_token :invitation_code end invite = Invite.new invite.save invite.invitation_code # => 44539a6a59835a4ee9d7b112 invite.regenerate_invitation_code # => true
SecureRandom được sử dụng để tạo ra chuỗi gồm 24 ký tự.Tuy nhiên thì has_secure_token sử dụng Base58 thay vì hex để tạo ra token, vì vậy nó chỉ hoạt động tốt với database PostgresSQL, còn đối với các loại database khác có thể phát sinh lỗi.
5. Render một template bên ngoài controller
Rails 5 cho phép render template hoặc inline code bên ngoài controller, tính năng này vô cùng quan trọng và hữu ích cho ActiveJob và ActionCable
# render inline code ApplicationController.render inline: '<%= "Hello Rails" %>' # => "Hello Rails" # render a template ApplicationController.render 'sample/index' # => Rendered sample/index.html.erb within layouts/application (0.0ms) # render an action SampleController.render :index # => Rendered sample/index.html.erb within layouts/application (0.0ms) # render a file ApplicationController.render file: ::Rails.root.join('app', 'views', 'sample', 'index.html.erb') # => Rendered sample/index.html.erb within layouts/application (0.8ms)
ActionCable
ActionCable là chức năng mới có trên Rails 5, nó là 1 framework dành cho việc giao tiếp thời gian thực trên web sockets. Mỗi ActionCable server sẽ cung cấp một hoặc nhiều kênh, ở đó người dùng có thể đăng kí thông qua kết nối web sockets, mỗi kênh này có chức năng gửi message đến tất cả những subscribers cùng lúc.
Hiện tại ActionCable vẫn phụ thuộc vào Redis và khi chạy cần required faye-websocket & celluloid. Một ứng dụng ActionCable yêu cầu 3 thành phần cơ bản
-
Connection:là 1 class bắt nguồn từ ActionCable::Connection::Base, đây cũng là nơi kết nối và đồng bộ dữ liệu xảy ra.
-
Chanel: Đây chính là những gì chúng ta sẽ tìm thấy thông qua web sockets và được bắt nguồn từ ActionCable::Channel::Base
-
Client: Thư viện Javascript để trở thành ActionCable client
Turbolinks 3
Turbolinks là một tính năng đã được tích hợp từ Rails 4. Cũng có khá nhiều phản hồi từ người dùng cho tính năng này, yêu có, ghét có.
Lần này Rails 5 được trang bị Version turborlink mới hơn và với việc HTML hỗ trợ custom data attributes, chúng ta kỳ vọng phiên bản nâng cấp này sẽ góp phần đẩy nhanh tốc độ của các ứng dụng Rails.
Thay đổi đáng kể nhất trong phiên bản này chính là tính năng Partial Replacement, ngay từ Client Side, chúng ta có thể quyết định nội dung nào cần thay thế, và nội dung nào thì không.
Turbolinks sẽ tìm kiếm các thuộc tính tùy chỉnh của HTML data-turbolinks-permanent và data-turbolinks-temporary rồi quyết định quá trình thay thế chúng trong DOM.
Sử dụng Turbolinks.vist và Tuborlinks.replace để update DOM. Với cả hai hàm trên đề trả về 1 hash với id tương ứng hoặc một mảng các id của các thành phần HTML
|**Action**| **Results** | | Turbolinks.visit(url, { change: ['entries'] }) | Có khả năng thay thế DOM element bằng thuộc tính tùy chỉnh @data-turbolinks-temporary@ hoặc các phần tử HTML có Id bị thay đổi | | Turbolinks.visit(url) | Chỉ những DOM elements nào có thuộc tính @data-turbolinks-temporary@ thì mới được bảo toàn, còn lại sẽ bị thay thế | |Turbolinks.visit(url, { keep: ['flash'] })|Giữ lại các DOM elements có thuộc tính @data-turbolinks-permanent@ và các phần tử mà Id của chúng đã được kê khai, còn lại sẽ bị thay thế| |Turbolinks.visit(url, { flush: true })| Replace mọi thứ|
Chúng ta có thể sử dụng các chức năng tương tự cho server side bằng cách sử dụng render hoặc redirect_to. Bạn có thể thích hoặc không thích sử dụng turbolinks, nhưng đây là thời điểm để bạn thử nghiệm, biết đâu bạn sẽ tìm thấy thứ phù hợp nhất và tốt nhất dành cho ứng dụng của mình.
Rails API
Rails API là một tính năng riêng dùng để xây dựng các API trên Ruby on Rails. Rails API là một gem độc lập, nó có phần core riêng dùng để xây dựng các khung ứng dụng API.
Rails API hỗ trợ tạo nhanh các API cho ứng dụng bằng cách loại bỏ những khâu trung gian, nhằm tạo ra những dịch vụ thích ứng tốt nhất với từng loại ứng dụng.
Từ Rails 5 trở đi, Rails API được tích hợp sẵn, chúng ta không cần phải add thêm Gem. Để tạo một API mới ta chỉ việc generate thông qua dòng lệnh:
rails new demo_api --api
Để tìm hiểm thêm về việc tạo và sử dụng Rails API, chúng ta có thể nghiên cứu thêm qua bài viết này.
Kết luận
Đây không phải là danh sách đầy đủ những thay đổi hoặc tính năng mới trong Rails 5, chỉ là một cái nhìn thoáng qua những thay đổi có trên phiên bản mới này. Để theo dõi những thông tin mới nhất cũng như cập nhật phiên bản mới nhất, các bạn có thể thông qua các link dưới đây:
https://twitter.com/dhh
https://github.com/rails/rails/pulls