Decorator – cầu nối giữa View và Model

Như chúng ta đã biết, Rails được xây dựng trên mô hình MVC, với Controller là cầu nối xử lý dữ liệu giữa View và Model. Ngoài 3 lớp này, Rails còn có thêm helper. Helper thường được coi là nơi chứa các đoạn mã logic phức tạp thay cho View.

Tuy nhiên, với thực tế trong những project lớn, Helper trở nên quá khó quản lý vì bị phân tán, hoặc chỉ khác nhau 1 chút ít, thì việc review hoặc maintain trở nên thực sự khó khăn. Lúc này, có 2 giải pháp để khắc phục nhược điểm này của Helper. 1 là Cells, 2 là Decorator. Bài viết này mình xin nói về cách sử dụng Decorator. Decorator là lớp phụ trợ, là cầu nối giữa Model và View. Hiện tại nó thường được xếp vào dạng “Presenter”. Ưu điểm của Decorator là :

  • Không cần viết thêm những đoạn mã logic thừa thãi trong View và Model.
  • Phòng tránh tình trạng phức tạp hoá Helper.

Có 2 gem giúp chúng ta thêm lớp Decorator này vào Rails là ActiveDecoratorDraper. Đây là bài giới thiệu về Draper trên RailsCasts. 2 gem này khá giống nhau, nhưng bản thân mình thích ActiveDecorator hơn vì nó không yêu cầu phải sửa lại controller như Draper. Bài viết này mình sẽ giới thiệu về ActiveDecorator. Nội dung:

Cài đặt

  1. Thêm gem "active_decorator" vào Gemfile.
  2. Tạo module decorator cho mỗi ActiveRecord muốn sử dụng. Ví dụ, với model UserComment thì decorator sẽ có tên là UserCommentDecorator. Có thể dùng câu lệnh : rails g decorator UserComment.

Ứng dụng

Khi cần hiển thị ngày giờ đăng 1 comment mới theo 1 format định sẵn, hay hiển thị tên user đã comment :

Như vậy, lúc này ở view ta chỉ cần viết rất ngắn gọn như sau :

Ngắn gọn, dễ hiểu, không chứa logic trong view, DRY, và dễ dàng thay đổi, không khó hiểu khi Decorator đang dần trở thành 1 phần không thể thiếu trong 1 Rails app.

Lưu ý

  1. Tên các file decorator đều theo quy ước ở trên. Các file này sẽ đặt trong app/decorators.
  2. Những method định nghĩa trong decorator chỉ sử dụng được như những instance trong trường hợp dưới đây:
    • Instance của các model được xử lý bằng controller và gửi sang view.
    • Instance của các object là tham số trong cách gọi render dưới dạng local hoặc object/collection

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Đăng xuất / Thay đổi )

Connecting to %s