12/08/2018, 14:16

Sử dung gem cells trong rails

Trong ứng dụng rails để gộp và tái sử dụng view nhiều lần, chúng ta thường dùng Partial. Tuy nhiên, khi muốn gộp chung cả logic vào view để tạo một template dùng chung thì qủa thực rất phức tạp. cells sinh ra là để giúp chúng ta giải quyết vấn đề này. 1. Giới thiệu Gem cells cho phép ta đóng ...

Trong ứng dụng rails để gộp và tái sử dụng view nhiều lần, chúng ta thường dùng Partial. Tuy nhiên, khi muốn gộp chung cả logic vào view để tạo một template dùng chung thì qủa thực rất phức tạp.

cells sinh ra là để giúp chúng ta giải quyết vấn đề này.

1. Giới thiệu

Gem cells cho phép ta đóng gói view và controller.

Là một lớp Ruby cơ bản giúp render các template, với những view có logic phức tạp, thì cells sẽ giúp code trở nên dễ đọc và dễ dàng tái sử dụng. Ngoài ra, cells còn thích hợp với các mô hình OOP, đa hình, kế thừa, nesting...Có thể sử dụng rails helper để đóng gói JS, CSS, image, simple distribution sử dụng gem hoặc rails engines.

2. Cấu trúc file

Trong Rails, cells được đặt trong app/cell hay app/concepts. Với cấu trúc như sau:

 app
├── cells
│   ├── post_cell.rb
│   ├── post
│   │   ├── show.erb
│   │   ├── list.erb
        ├── post.css

3. Cài đặt và sử dụng

  • Thêm vào Gemfile và chạy bundle install.

  • Hơn nữa, cells hỗ trợ nhiều template như: cells-erb, cells-hamlit, cells-haml, cells-slim. Và khi muốn sử dụng mẫu template nào, cần thêm nó vào gemfile.

//gemfile
gem "cells"
gem "cells-erb" //hoặc gem "cells-haml"...
  • Khởi tạo cell bẳng lệnh sau:
rails g cell Post show
// cấu trúc cell được tạo ra:
 create  app/cells/post_cell.rb
 create  app/cells/post/show.erb

cells được sử dụng khá đơn giản và dễ hiểu:

  • Class:
class PostCell < Cell::ViewModel
  def show
    render //mặc định render ra view tương ứng.
  end
end

Có thể thêm nhiều cell vào trong view bằng cách:

class PostCell < Cell::ViewModel
  def show
    render + render(:additional)
  end
end

Ngoài ra, ta có thể nesting cells, tức là gọi cell trong cell:

class PostCell < Cell::ViewModel
  def show
    render + cell(:comment).() // cells/comment/show.erb
  end
end
  • View: show.erb or show.haml,... tương tự những partial khi dùng trong view.
  • Render: Có nhiều cách để gọi lại cell ở views.
//render show.erb
<%= cell(:post).(:show) %>

render với các action khác kèm theo params:

<%= cell(:post).(:index, author: "saru") %>

Tuy nhiên, gem cells khi dùng cũng còn một số hạn chế:

  • Không sử dụng được lazy I18n trong cells, bắt buộc sử dụng là phải gọi đến đường dẫn tuyệt đối.
  • helpers sao chép từ module đến view không tồn tại trong cells. Khi muốn sử dụng thì cần phải include vào.
  • Không render trên view được.

Như vậy, các bạn đã có một cái nhìn tổng quát về gem cells và cách sử dụng nó ở trong ứng dụng rails.

Thanks for your reading!

0