+1

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

Bình luận

Đăng nhập để bình luận
Avatar
@TranDinhVi
thg 7 24, 2017 12:45 SA

Nói decorate là cầu nối giữa model và view thì chưa chuẩn lắm, nếu nói là cầu nối model và view thì phải là presenter pattern. Như đã đề cập ở trên thì để tránh viết code xữ lý logic trong view gây ra tình trạng View smells thì mình viết thêm method full_name, tuy nhiên vì nó không phải là utility method nên không thể để trong helper được, nó cũng không phải là business logic nên không thể cho vào model, lúc này ta nghĩ đến decorate

Avatar
+1
Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí