Brut - Framework web mới cho Ruby
(naildrivin5.com)- Một framework web đơn giản nhưng mạnh mẽ cho hệ sinh thái Ruby, dựa trên triết lý abstraction thấp, low-ceremony, cung cấp kiến trúc tập trung vào trang, form và action đơn mà không có khái niệm controller hay REST resource
- Render HTML trên server, viết JS/CSS trực tiếp, tích hợp OpenTelemetry, Sequel, OptionParser và các công cụ Ruby hiện đại đều có sẵn, cho phép cài đặt và phát triển trong vài phút
- Cấu trúc dựa trên lớp, quản lý session/form/parameter theo kiểu thực, giảm tối thiểu việc dùng method động và Hash để hướng tới mã rõ ràng và tự động tạo tài liệu
- Tận dụng nền tảng web hiện đại: xác thực server-client tích hợp, BrutJS (Web Components), đóng gói và hash CSS bằng esbuild, tăng cường chính sách bảo mật và nền tảng thiết kế DB
- Giảm tối thiểu YAML, cấu hình dựa trên Ruby/Hash cùng đặt tên và phân tách vai trò rõ ràng, mục tiêu là tận hưởng Ruby và công nghệ trình duyệt mà không áp đặt trừu tượng hay pattern không cần thiết
Tính năng chính của framework Brut
Cấu trúc hoàn toàn mới – tập trung vào trang, không có controller
- Thay vì controller, REST resource và route action, hệ thống được tổ chức bằng page class, form và handler action đơn
- HTML được tạo trực tiếp trên server, JS/CSS có thể viết theo ý muốn
- Ví dụ: trang hiển thị thời gian được định nghĩa trực tiếp bằng
TimePage < AppPage
Tận dụng tích cực nền tảng web hiện đại
- UX form với xác thực được tích hợp cả server-side lẫn client-side
- Hỗ trợ mở rộng dần HTML bằng BrutJS (thư viện web components)
- esbuild xử lý bundle và hash CSS một cách gọn nhẹ, không cần PostCSS hay SASS
Tích hợp sẵn năng suất phát triển và nền tảng cốt lõi
- Khả năng quan sát dựa trên OpenTelemetry, truy cập dữ liệu bằng Sequel, tự động hóa CLI bằng OptionParser
- Chính sách bảo mật mặc định, giá trị mặc định cột DB/khóa ngoại/chỉ mục, thời gian luôn timezone-aware, localization dễ dùng
- Kiểm thử với RSpec, sinh dữ liệu bằng Faker/FactoryBot, tạo HTML bằng Phlex
Loại bỏ YAML, cấu trúc cấu hình rõ ràng
- I18n dùng Ruby Hash, cấu hình động được quản lý bằng dotenv (hầu như không dùng YAML)
- docker-compose là ngoại lệ duy nhất khi dùng YAML
Không áp đặt trừu tượng hay pattern không cần thiết
- Đặt tên và cấu trúc rõ ràng (ví dụ: truy cập
WidgetsPagebằng/widgets) - Tách biệt hoàn toàn tầng dữ liệu (DB::Widget) và tầng domain (Widget)
- Không có khái niệm controller, có thể triển khai business logic theo cách bạn muốn
- Không áp đặt các pattern hàm phức tạp, monad, Proc, v.v.
Trải nghiệm phát triển và tính linh hoạt
- RSpec và các công cụ hiện đại trong hệ sinh thái Ruby được tích hợp sẵn
- Tận dụng tích cực các thư viện cốt lõi như Phlex (HTML), Faker/FactoryBot, Sequel, OpenTelemetry
- Tập trung vào “niềm vui” của Ruby và công nghệ trình duyệt bằng cách thoát khỏi boilerplate, cấu hình và quyết định lặp lại
Tại sao là Brut?
- Thay vì setup lặp đi lặp lại, tranh luận thiết kế/cấu trúc không ngừng và sự linh hoạt dư thừa trong Rails cùng các framework khác, Brut theo đuổi niềm vui của bản thân code
- Là một framework web Ruby tập trung vào năng suất và sự rõ ràng, giúp bạn xây dựng, phát triển và triển khai ứng dụng nhanh chóng một cách thú vị
Khởi động và lộ trình
- Hỗ trợ image Docker chính thức của Brut và tạo/chạy ứng dụng nhanh bằng lệnh CLI
- Cung cấp các ứng dụng mẫu thực tế như ADRs.cloud
- Phiên bản 1.0 và roadmap chính thức sẽ được cập nhật liên tục
3 bình luận
https://naildrivin5.com/blog/2025/…
Có vẻ cần sửa lại theo liên kết này
Có vẻ như liên kết đang bị gắn sai.
Ý kiến trên Hacker News
Tôi thích cách tiếp cận tập trung vào forms và pages; bản thân tôi cũng dùng cách này trong ứng dụng của mình. Mọi tương tác đều do Forms và Links dẫn dắt, và mọi phần cải tiến bằng JavaScript thực chất cũng chỉ ở mức bấm vào một form đã tồn tại sẵn (kể cả những form bị ẩn). Bạn luôn có thể kiểm tra trực tiếp HTML để biết rõ route nào thật sự xử lý tương tác. Theo tôi, controllers đang bị lạm dụng; trên thực tế chỉ cần forms và models (backend), cùng với views (Pages) là đủ. Nhiều phần validation hay các quy trình lặp đi lặp lại trong controller cũng có thể được framework xử lý tinh tế hơn
Tôi thích cách bài viết giải thích rằng không nhất thiết phải hiểu các khái niệm phức tạp như monad, algebraic data types, currying, hay xử lý mọi thứ bằng Proc. Nếu muốn dùng functor trong business logic thì hoàn toàn có thể chọn làm vậy. Tôi thích sự linh hoạt này, nên có cảm giác muốn thử nó cho một side project cùng với một vài đồng nghiệp dày dạn kinh nghiệm
Framework này có vẻ là điểm trung gian rất tốt giữa sự gọn nhẹ của Sinatra và sự đầy đủ của Rails. Tôi vẫn dùng Sinatra cho các ứng dụng đơn giản và Rails khi cần, nhưng với những app không quá phức tạp thì Rails lại có phần nặng nề. Tôi khá háo hức muốn thử thứ mới này
Roda cũng là một lựa chọn đáng tham khảo; nó rất phù hợp cho các dự án nhỏ và cũng mở rộng tốt. Nhờ hệ thống plugin nên việc mở rộng tính năng khá dễ, và routing tree cũng dễ xử lý
Với tôi thì hanami từng là điểm trung gian tốt nhất, nhưng sắp tới tôi sẽ theo dõi sát sao sự phát triển của bruts
Tôi thực sự rất thích cuốn sách Sustainable Rails, và đó luôn là cuốn tôi khuyên đọc khi nói về Rails. Cách tiếp cận của framework này rất ấn tượng. Sẽ rất thú vị nếu một trong những framework thay thế nhỏ như thế này áp dụng hoàn chỉnh Sorbet để dùng cho những thứ như form validation. Tất nhiên điều đó có thể trái với hướng tiếp cận gradual typing, nhưng như một thử nghiệm thì sẽ rất vui
David không chỉ là một lập trình viên rất tài năng mà còn là một diễn giả xuất sắc. Tôi cũng khuyên xem bài nói chuyện trên video có liên hệ với chủ đề của cuốn sách: https://www.youtube.com/watch?v=CRboMkFdZfg
Sorbet cũng tốt, nhưng cá nhân tôi thích hệ sinh thái dry-rb hơn cho việc áp đặt cấu trúc và kiểm chứng dữ liệu (data validation)
Tôi hiểu là framework này dùng một giấy phép hơi khác thường, nhưng tôi tò mò liệu điều đó có nghĩa là không thể xem mã nguồn hay không
Có thể xem source trên github: https://github.com/thirdtank/brut
Tôi đồng ý là giấy phép này có cảm giác hơi kỳ lạ
Dự án này khiến tôi nhớ tới framework Camping ngày trước, chỉ khác là nó không có constructor cho lớp cha động
Trang chính thức của Brut (https://brutrb.com/overview.html) cũng có khá nhiều nội dung thú vị
Tôi đã thử đăng nhập ở trang mẫu nhưng gặp lỗi ngay sau khi xác thực GitHub
Tôi chưa dùng Ruby lúc này, nhưng đã hứng thú với dự án nên bấm Star, biết đâu đây sẽ là thứ khiến tôi thực sự thử dùng Ruby
Tôi đặc biệt thích việc chọn Phlex. Cá nhân tôi cũng tò mò liệu framework này có hợp với thư viện Datastar js và cách thư viện đó tận dụng SSE (server-sent events) hay không. Cảm ơn