Sử dung gem cells trong rails
Bài đăng này đã không được cập nhật trong 8 năm
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ạybundle 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
orshow.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!
All rights reserved