Phát hành Rails 7.1
(github.com/rails)- Khi dùng
config.load_defaults 7.1, cơ chế tuần tự hóa mặc định củaActiveSupport::MessageVerifiervàActiveSupport::MessageEncryptorđược đổi từ Marshal sangActiveSupport::JSON, và vẫn có thể tiếp tục đọc các message Marshal hiện có ActiveRecord::Base.serializeđược thay đổi để mặc định không dùng YAML, và có thể khôi phục giá trị mặc định cũ bằngconfig.active_record.default_column_serializer = YAML- Định dạng cache
7.1mới được bổ sung và được dùng làm mặc định cho ứng dụng mới; với ứng dụng hiện có, có thể kích hoạt bằngconfig.load_defaults 7.1hoặcconfig.active_support.cache_format_version = 7.1- Các mục được ghi bằng định dạng cache
6.1hoặc7.0có thể được đọc trong định dạng7.1 - Khi rolling deploy Rails 7.1, cần giữ nguyên định dạng cache ở lần deploy đầu tiên, rồi bật định dạng cache
7.1ở lần deploy sau
- Các mục được ghi bằng định dạng cache
- Cơ chế tuần tự hóa
:message_packvà:message_pack_allow_marshalđược thêm vàoMessageEncryptor,MessageVerifier,config.active_support.message_serializer, yêu cầu gemmsgpack>= 1.7.0 - Ngăn rò rỉ giá trị bí mật trong
inspectcủaActiveSupport::KeyGenerator,MessageEncryptor,EncryptedConfiguration, các đối tượng mã hóa Active Record, đồng thời tăng cường bảo vệ XSS trongActionView::HelpersvàERB::Util has_secure_passwordđược bổ sung kiểm trapassword_challengevà phương thức#{attribute}_salt, cònauthenticate_byđược thêm vào để giảm các cuộc tấn công liệt kê dựa trên timing theo sự tồn tại của tài khoản- Active Record mở rộng hỗ trợ cho khóa chính tổng hợp và khóa ngoại tổng hợp, bao gồm cú pháp tuple
where, sắp xếp batch theo khóa tổng hợp, và suy luận khóa chính tổng hợp từ schema - Hỗ trợ PostgreSQL được bổ sung các lệnh migration để đổi tên enum, thêm giá trị, thay đổi giá trị; cùng với exclusion constraint, unique constraint, tùy chọn chỉ mục
INCLUDE, và hỗ trợ chỉ mụcNULLS [NOT] DISTINCT - Adapter SQLite3 nêu rõ mức cải thiện hiệu năng trung bình 2× nhờ Write-Ahead-Log normal syncing mode, capped journal size, shared memory buffer, shared cache; đồng thời strict strings mode vô hiệu hóa double-quoted string literal được bật mặc định
- Việc lặp batch trên toàn bộ bảng trong Active Record mặc định dùng range iteration để cải thiện hiệu năng; trong bài test PostgreSQL với 10 triệu bản ghi, kết quả được đưa ra là querying
253s→30s, updating288s→124s, deleting268s→83s - Connection pooling cho
MemCacheStorevàRedisCacheStoređược bật mặc định; để tắt, cần chỉ địnhpool: falsetrong cấu hình cache store - Bổ sung adapter cho database client
Trilogy, cho phép dùngadapter: trilogyhoặcDATABASE_URLtheo định dạngtrilogy:// - Định dạng tag mặc định của
ActiveRecord::QueryLogsđược đổi sang định dạng SQLCommenter; có thể dùng định dạng cũ vớiconfig.active_record.query_log_tags_format = :legacy - Các mục deprecated và bị loại bỏ bao gồm việc dùng singleton
ActiveSupport::Deprecation,SafeBuffer#clone_empty, đối sốrewherecủa#merge,deferrable: truecủaadd_foreign_key,TestFixtures#fixture_path, cùng nhiều cấu hình và API Active Record deprecated khác đã được dọn dẹp ActionView::TestCase.register_parserđược thêm vào cho kiểm thử Action View để đăng ký parser cho kết quả render, với các parser mặc định là:htmlvà:json
1 bình luận
Ý kiến trên Hacker News
Rails rất tuyệt, và hiện giờ nó còn tốt hơn bao giờ hết
Giai đoạn đầu sự nghiệp tôi chủ yếu dùng Django và Laravel, sau đó chuyển sang làm các công việc frontend phổ biến ngày nay, và năm nay lại nhận một dự án Rails + Hotwire
Tôi thật sự ngạc nhiên vì mọi thứ đã đơn giản đến mức nào, và thấy tiếc vì hầu hết chúng ta đã quên rằng mọi thứ có thể dễ dàng như vậy. Cũng đáng sợ ở chỗ những người mới bước vào ngành hiện nay có thể sẽ không được trải nghiệm sự đơn giản này
Nếu bạn chưa từng dùng Rails, hoặc từng bỏ qua nó chỉ vì nghe những câu như “PHP xấu xí / Rails đã chết / JavaScript lộn xộn”, tôi khuyên bạn tạm thời bỏ ngoài tai lời người khác và thử dùng nó với một tâm thế cởi mở
Nó có thể không phải lựa chọn tốt nhất cho môi trường có 1.000 kỹ sư cùng làm việc trên một repository, nhưng với đội ngũ nhỏ thì gần như không có đối thủ và vượt xa các lựa chọn khác. Nói thật thì Laravel có lẽ cũng tốt ở mức tương tự
Về tốc độ phát triển ban đầu, tôi nghĩ Rails luôn thắng. Các quy ước của nó rất chặt chẽ và được thiết kế tốt đến mức hầu như không có gì theo kịp. Laravel đang bắt kịp, nhưng tôi cho là vẫn chưa tới
Tuy nhiên LiveView mở rộng tốt hơn theo mọi nghĩa. Nó cũng có nhiều thứ tích hợp sẵn như xác thực, truy cập cơ sở dữ liệu, hàng đợi tác vụ, mailer, bộ công cụ kiểm thử đầy đủ; gần như không cần tự viết JavaScript, và còn có BEAM, một máy ảo tuyệt vời
Ít nhất thì tôi thấy mừng vì tất cả các dự án này đều đang cùng tham gia cuộc chiến “hãy lùi lại một bước”. Ở công ty tôi dùng React và Relay; dù đã dùng JavaScript frontend lâu năm và nghĩ mình cũng khá ổn, vẫn có quá nhiều rào cản phải vượt qua nên rất mệt
Vì không kiếm được việc nên tôi cũng không tích lũy đủ kinh nghiệm, và cuối cùng bị các “phù thủy” đó vượt qua. Có tin tuyển dụng kiểu đó còn mở hơn 12 tháng
Thay vào đó, vì đó là nơi có nhu cầu, tôi lại đang rải thêm JavaScript ra thế giới
Về mặt cấu trúc, tôi thích cách tiếp cận của ember-data. Có nhiều phần có thể tự động hóa trong các thao tác như left join/right join của tập dữ liệu, và cũng có mock server tích hợp
Có điều có lẽ vì nó hoạt động quá tốt nên trông không “ngầu” bằng những thứ khác
https://emberjs.com/
Tôi đã nâng một ứng dụng Rails 7.0 dài 13.000 dòng lên 7.1, và ngoài khác biệt giữa 7.0 và 7.1[0], mọi thứ đều chạy sau khi chỉ đổi 1 dòng trong mã thiết lập test
Xét về lộ trình nâng cấp dễ dàng thì tôi xem đây là một thành công. Giờ phần thú vị là refactor một số mã để dùng các tính năng mới của 7.1
Nếu quan tâm, tôi cũng đã nâng ứng dụng ví dụ Rails / Docker lên 7.1: https://github.com/nickjj/docker-rails-example
Rails 7.1 có kèm Dockerfile, nhưng vẫn còn nhiều lựa chọn có thể bổ sung, chẳng hạn dùng Docker Compose để tạo trải nghiệm chạy ngay được trong cả phát triển lẫn production, đồng thời bao gồm Postgres, Redis, Action Cable, Sidekiq, v.v.
[0]: https://railsdiff.org/7.0.8/7.1.0
Đang cố nâng một codebase Rails 6 khá lớn, có gắn rất nhiều React, lên theo cách “không” JavaScript mới dùng Hotwire. Chúc tôi may mắn nhé
Rails rất tuyệt khi bạn giữ nguyên các mặc định, nhưng hễ bước ra khỏi các mặc định đó là bước vào vùng đất đau khổ
Nếu muốn tuyển kỹ sư frontend thì nguồn ứng viên React lớn hơn vài bậc. Việc tìm các gói JavaScript thuần cho những tác vụ thông thường rồi bọc chúng bằng Stimulus controller cũng ngày càng khó hơn so với tìm gói React
Stimulus cũng không thực sự cung cấp cách viết unit test cho controller. Với React thì có thể dùng jest và react-test-renderer như thường lệ
Hơn nữa, tranh cãi gần đây về Turbo TypeScript không đem lại niềm tin vào việc vận hành dài hạn của hệ sinh thái Hotwire
Vẫn chưa đưa ra quyết định. Rõ ràng việc Stimulus mang cảm giác như một cách rất “đúng kiểu Rails” để viết code frontend là một điểm cộng, đặc biệt với các nhóm nhỏ vốn đã quen Rails
Nếu ứng dụng khá đơn giản và khớp tốt với cách làm của framework thì framework rất tuyệt. Nếu cần cấu hình phức tạp và linh hoạt hơn, bạn nên nhìn sang thư viện
Giờ thì hoặc render phía server bằng slim, hoặc làm API-only và tách frontend riêng
Rails đã đổi hướng quá nhiều lần khi cố làm JavaScript: CoffeeScript, tiền biên dịch asset, webpack, v.v.
Nhân tiện, cách xử lý JavaScript cho ứng dụng một trang trong Rails 7+ cũng hợp lý hơn trước rất nhiều. Về cơ bản, bạn có thể dùng bất kỳ công cụ build nào mình muốn tách khỏi ứng dụng Rails
Trong lúc phát triển, bạn phải chạy thứ như
yarn build --watchcùng vớirails s, nhưng cá nhân tôi thấy không tệ và đơn giản hơn nhiềuCông ty chúng tôi làm phần mềm tự động hóa nâng cấp Rails, và cũng cung cấp dịch vụ trọn gói làm hộ việc nâng cấp Rails. Nếu quan tâm, có thể liên hệ steve (at) infield.ai hoặc tạo kế hoạch nâng cấp Rails miễn phí tại https://app.infield.ai/users/sign_up. Không cần thẻ tín dụng
Xem thêm chi tiết tại https://docs.infield.ai/docs/creating-an-upgrade-path
Với tôi thì gần như khớp ngay như một thay thế cho webpack
Tôi thích Rails và đã dùng không thường xuyên từ thời Rails 2
Đây là một framework rất tốt, và với người như tôi, thỉnh thoảng cần dựng một website, thì nó thật sự là con đường ít trở ngại nhất
Tuy vậy, quá trình thiết lập để chạy Rails trên laptop mới khá khổ sở. Cần node, rồi từ đó cần npm. Là backend developer nên tôi không rõ phải thiết lập node thế nào, theo thứ tự nào
Vì không làm thường xuyên nên lần nào cũng như đánh vật. Cuối cùng cũng làm được, nhưng tôi luôn không chắc vì sao rốt cuộc mọi thứ lại khớp với nhau
Giá mà có một trình cài đặt chỉnh mọi thứ cần thiết cùng lúc để rails cứ thế chạy được. Trình cài rvm thiết lập rails trên ruby, nhưng không thiết lập cả hệ thống node bên dưới
https://asdf-vm.com/
Node chủ yếu được biết đến như công cụ frontend và Rails cũng dùng nó cho mục đích đó, nhưng theo tôi nhớ thì ít nhất ban đầu Node được tạo ra để đưa runtime JavaScript sang backend
Ngay cả không có trình quản lý gói, trên Windows thì chỉ là node.exe; theo tôi biết chỉ cần tải npm về, giải nén, rồi đưa node và npm vào biến môi trường PATH
Và cài node khá dễ. Thật ra là quá dễ. Tôi ước nó khó hơn nhiều và cần có bằng cấp
JavaScript cũng chỉ là một công cụ như mọi thứ khác. Dù thích hay không, nó là một công cụ rất quan trọng, và dù thích hay không, nó sẽ còn tồn tại lâu dài
Nếu cởi mở hơn một chút và ít nhất học những điều cơ bản, công việc sẽ dễ hơn
Mong Rails + HTMX và cách chỉ rắc thêm một chút JavaScript cho những trang có tính tương tác rất cao sẽ hồi sinh
Dùng Rails cùng Slim/HAML thật sự rất thú vị. Nếu muốn, cũng có thể dùng thư viện như
ViewComponentsđể render từng phần dễ hơn. Thêm web components vào đó thì có thể tạo các trang khá tương tác, và nếu một trang cụ thể thật sự cần thì vẫn có thể dùng ReactHATEOAS giúp giảm đáng kể độ phức tạp của ứng dụng. Dù vậy nếu cần API, việc phản hồi các MIME type khác nhau cũng rất dễ, và nếu muốn còn có thể dùng chung cùng một endpoint
Theo kinh nghiệm, phần lớn ứng dụng dùng React thật ra hoàn toàn không cần React. Chúng dùng React chỉ vì vài menu popup
Vì vậy, nếu các ứng dụng lớn không dùng React, hoặc chỉ dùng rất ít React, bắt đầu xuất hiện, tôi mong sẽ có người nhận ra ứng dụng của chúng ta ngày nay phức tạp không cần thiết đến mức nào
Thế mà tôi đã thấy người ta nói “ai cũng dùng React nên phải chuyển sang React”. Thở dài
Mơ thì vẫn được mà
Thông báo chính thức ở đây: https://rubyonrails.org/2023/10/5/Rails-7-1-0-has-been-released
Có thêm một chút chi tiết ở mức tổng quan, và rất háo hức muốn thử một số thay đổi mới. Đặc biệt các phương thức truy vấn bất đồng bộ mới có vẻ sẽ khá hữu ích để cải thiện hiệu năng nhanh chóng
Rails ở backend chưa nhận được sự đánh giá xứng đáng
Tuy nhiên phía frontend thì đã lộn xộn trong một thời gian rất dài
Bây giờ làm việc với Rails 7.1 + Hotwired + Importmaps rất thú vị
Nhưng đã phải chờ cho đến khi trình duyệt hỗ trợ tối thiểu ES6 và Import Maps đủ tốt
Nếu nhìn ngày của bài này https://web.dev/import-maps-in-all-modern-browsers/, họ công bố vào ngày 28/03/2023 rằng importmaps có thể dùng trên mọi trình duyệt hiện đại
Vì vậy cho đến giờ vẫn không có cách nào tránh Webpack, Yarn và các công cụ hỗ trợ JavaScript khác
Nay đã có importmaps và hỗ trợ ES6 của trình duyệt cũng đủ tốt https://caniuse.com/?search=es6, nên có thể dùng JavaScript hiện đại mà hầu như không cần thêm công cụ nào
Vài tuần trước một người bạn đùa rằng: “Nếu một bản phát hành Rails được công bố mà cậu không gửi PR nâng cấp, thì chuyện đó có thật sự xảy ra không?”
Rồi, giờ đến lúc gửi PR. Dù có phải xếp nó sau PR 7.0 đã nằm chờ suốt mấy tháng
Theo kinh nghiệm, nhiều đội gặp khó khăn khi xây dựng codebase gọn gàng với ActiveRecord
Mong đừng ném đá, nhưng tôi vẫn đang dùng Rails 4.2 và hài lòng với nó
Nó cung cấp đủ mọi thứ tôi cần cho các công việc SaaS backend không có hoặc ít JavaScript mà tôi tự làm hoặc làm cho các công ty B2B, và chạy được cả trên VPS cấu hình thấp
Nếu có thời gian trả lời, tôi tò mò vì sao nên nâng cấp
Vấn đề cốt lõi của các phiên bản cũ là lỗ hổng trong các gem liên quan. Ví dụ nokogiri có thể không nâng lên được nếu không nâng major Rails
Tuy nhiên đa số app không làm những việc như phân tích XML phức tạp, nên khá nhiều lỗ hổng không áp dụng. Vì vậy cần một chút bảo trì để kiểm tra xem có an toàn không. Cũng thường phải thêm monkey patch để tránh lỗi
Nâng cấp sẽ cải thiện bảo mật và giảm thời gian bảo trì. Nhưng cũng cần cân nhắc chi phí nâng cấp liên tục. Một yếu tố khác là các phiên bản mới có thể hỗ trợ Ruby nhanh hơn
Thông thường khi tạo app Rails tôi dùng bản phát hành mới nhất, nhưng sau đó không nâng các phiên bản Rails nữa trừ khi app rất phổ biến hoặc quá cũ đến mức có thứ gì đó không chạy trên hệ thống mới