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 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.

Tài liệu tham khảo

https://github.com/drapergem/draper http://johnotander.com/rails/2014/03/07/decorators-on-rails/


All Rights Reserved