What's new in Rails 5?

badges_SimpleFacebook_Stage1.png

Intro

Ngay từ khi bắt đầu Rails đã được coi là framework dễ nhất và tốt nhất để phát triển web cho Ruby. Cho dù đến nay đã có nhiều lựa chọn khác cho Ruby trên web như Lotus nhưng Rails vẫn là lựa chọn đầu cho lập trình viên Ruby.

Tại RailsConf tháng 4/2015, David Heinemeier Hansson (người sáng tạo ra Rails) đã đưa ra thông báo về những điều mới mẻ trong Rails cũng như ngày phát hành của Rails 5 (ngày phát hình sẽ rơi vào mùa thu năm 2015 tuy nhiên đến nay vẫn chưa phát hành 😦)

Bài viết này sẽ tổng hợp một vài điểm thay đổi nổi bật.

Chỉ hỗ trợ Ruby 2.2.2 hoặc mới hơn

Vì lý do này mà một số API và yêu cầu của Rails sẽ thay đổi thành deprecate, Rails có thể sẽ thêm hoặc cải tiến các API và tất nhiên là tận dụng các tiến bộ của bản Ruby mới. Lý do mà Rails sử dụng Ruby 2.2.2 trở lên vì chức năng garbage collection được cải tiến có thể thu dọn cả symbol, điều mà chúng ta thường hay sử dụng trong Rails. Tất nhiên điều này giúp giảm thiểu việc sử dụng bộ nhớ của Rails

ActionCable

Thay đổi lớn nhất trong Rails 5 là giới thiệu ActionCable. ActionCable là một tính năng dùng để kết hợp Rails với WebSockets nhằm thêm khả năng gửi tin thời gian thực (real-time message). Đây thực sự là một thông tin vui với những ai đang làm về vấn đề này và đang ngập đầu trong vô vàn các thư viện.

ActionCable vẫn đang trong giai đoạn phát triển, chúng ta cần chờ đến lúc Rails 5 thực sự ra mắt để biết thêm thông tin về tính năng mới này.

ActiveRecord::Base#where.or

Trước đây, nếu muốn sử dụng điều kiện OR trong query SQL với ActiveRecord thì thường phải tự tạo 1 query sử dụng Arel

User.where(users[:id].eq("1").or(users[:id].eq("2")))

Năm 2013, ta đã có where.not với Rails 4 và bây giờ là where.or với Rails 5

Post.where("id = 1").or(Post.where("id = 2"))
# => SELECT * FROM posts WHERE (id = 1) OR (id = 2)

belongs_to

Như chúng ta đã biết thì vấn đề này đã được đè xuất rất lâu khi gần như mọi các liên kết belongs_to đều là bắt buộc và Rails 5 đã biến nó thành mặc định. Với việc nâng cấp app từ các bản Rails trước thì cần thêm config để chế độ này được bật lên

config.active_record.belongs_to_required_by_default = true

Tuy nhiên khi liên kết belongs_to của bạn không cần validate thì bạn có thể dùng optional: true:

class User
 belongs_to :group, optional: true
end

ActiveRecord::Base#has_secure_token

Có lẽ bạn đã từng dùng has_secure_password từ khi Rails 3.1 ra mắt. Bây giờ chúng ta có thêm has_secure_token, dùng để tạo ra các token như chúng ta vẫn thường làm để tạo ra salt, subcription token .. Cách sử dụng tùy chọn này cũng thật đơn giản:

class User < ActiveRecord::Base
has_secure_token :token1, :token2, key_length: 30
end
user = User.new
user.save
user.token1 # => “973acd04bc627d6a0e31200b74e2236”
user.token2 # => “e2426a93718d1817a43abbaa8508223”
user.regenerate_token1! # => true
user.regenerate_token2! # => true

ActionMailer

Hai method deliverdeliver! sẽ bị xóa bỏ và thay vào đó là deliver_nowdeliver_later (tất nhiên la bao gồm cả method với !). Hẳn ai cũng thấy đây giống như method gửi mail của các gem delayed_job, sidekiq hay resque. Thật sự là như vậy khi Rails 5 đã xây dựng ActionJob (sẽ được đề cập tiếp theo) phục vụ cho mục đích này.

Một thay đổi nữa là việc loại bỏ *_path để tránh các lỗi khi gửi mail, thay vào đó Rails 5 bắt buộc sử dụng *_url (thực ra tôi thấy điều này không hay vì có thể 1 server sử dụng nhiều domain và việc để tùy chỉnh thêm domain sẽ hợp lý hơn)

Ngoài ra, còn có một thay đổi liên quan đến template I18n. Trong các bản Rails trước khi tạo ra 2 template là welcome.en.erbwelcome.erb thì việc lựa chọn template luôn được ưu tiên cho welcome.erb cho dù bạn có chọn locale mặc định là en đi chăng nữa. Rails 5 sẽ ưu tiên chọn template có locale trước.

ActiveJob

ActiveJob là một phần tuyệt vời được thêm vào trong Rails 4.2.0. ActiveJob được thêm vào nhằm thích ứng với các thư viện hàng chờ phổ biến. ActiveJob cho phép thay đổi kiểu job inline jobsdelay jobs cực kỳ đơn giản:

Từ:

  ActiveJob::Base.queue_adapter = :inline

Sang:

  ActiveJob::Base.queue_adapter = :sidekiq

Trong bản mới, các job sẽ thừa kế từ base class app/jobs/application_job.rb

Đây là ví dụ việc sử dụng ActiveJob:

  class DoItLaterJob < ActiveJob::Base
    queue_as :do_it_later

    def perform(id)
      # Perform the background job
    end
  end

ActiveJob được kết hợp với ActionMailer cho phép gửi mail async dễ dàng hơn.

TurboLinks 3

TurboLinks là một phương thức giúp app của bạn chạy nhanh hơn một chút bằng việc sử dụng JavaScript để thay đổi các thành phần của trang thay vì phải load lại toàn bộ trang. Tuy nhiên TurboLinks cũng có thể làm cho app chạy nặng hơn trên client-side. TurboLinks đã là một phần của Rails từ phiên bản 4, nhưng ở Rails 5 sẽ áp dụng tính ưu việt hơn của TurboLinks 3.

Kết luận

Hiện tại thì Rails 5 vẫn chưa chính thức ra mắt nhưng chúng ta có thể có cái nhìn sơ lược về những thay đổi thú vị trong bản mới này.


All Rights Reserved