Decorate giúp việc quản lý tốt các phương thức của đối tượng
Decorator Như chúng ta đã biết, RoR được xây dựng trên mô hình MVC. Trong đó Model đóng vai trò xử lý dữ liệu, Views có nhiện vụ hiển thị dữ liệu cho người dùng. Giả sử bạn đang xây dựng một hệ thống tuyển dụng nhân sự, trong đó cần lưu rất nhiều thông tin của người dùng. Để phục vụ cho việc ...
Decorator
Như chúng ta đã biết, RoR được xây dựng trên mô hình MVC. Trong đó Model đóng vai trò xử lý dữ liệu, Views có nhiện vụ hiển thị dữ liệu cho người dùng.
Giả sử bạn đang xây dựng một hệ thống tuyển dụng nhân sự, trong đó cần lưu rất nhiều thông tin của người dùng. Để phục vụ cho việc filter, hệ thống cần lưu người dùng dưới dạng first_name và last_name. Nhưng trên views bạn cần hiện thị tên người dùng đó dưới dạng full_name = first_name + last_name. Tuy nhiên đối với những hệ thống lớn, số lượng phương thức cần xử lý tương tự như vậy sẽ rất lớn. Chính vì vậy khi cần nâng cấp, bảo trì hệ thống sẽ rất khó khăn. Decorator được sinh ra để giải quyết vấn đề này. Nó là cầu nối giữa Model và View. Decorator như một lớp con, cho phép chúng ta tạo thêm những hành động cho đối tượng mà không gây ảnh hưởng tới những đối tượng khác của cùng một lớp.
Cài đặt
Thêm gem "draper" vào gemfile
gem "draper"
sau đó bundle và tạo một decorator cho user, chạy lệnh sau
$ bundle install $ rails generate decorator User
Sau đó thực hiện lệnh trên, sẽ sinh ra thư mục app/decorators/ Bây giờ chúng ta viết 1 hàm lấy full_name
class UserDecorator < Draper::Decorator delegate_all def full_name if first_name.present? && last_name.present? "#{first_name} #{last_name}" end end end
UsersController
class UsersController < ApplicationController def show @user = User.find(params[:id]).decorate end end
../users/show.html.erb
<%= @user.full_name %>
Kết luận
Trong các dự án lớn, Helper sẽ được phân tán thành rất nhiều file và thư mục kiểu như user_helper... code thường bị phân tán hoặc khác nhau rất ít. Decorator được sinh ra để giải quyết những vấn đề này. Decorator là một pattern phụ trợ được thiết kế để giảm bớt số lượng dòng code cho Model đồng thời giao tiếp với View. Decorator không thật sự cần thiết trong mọi dự án nhưng đối với các dự án lớn có cấu trúc phức tạp Decorator trở thành một phần không thể thiếu.