Active Admin trong Rails
Bài đăng này đã không được cập nhật trong 5 năm
Sơ lược về Active admin
Gem Active admin được sử dụng để xây dựng nhanh chóng một giao diện trang quản trị đẹp mắt, nhanh chóng và dễ dàng sử dụng.
Chỉ với một số thao tác đơn giản cài đặt và cấu hình cho gem, ta sẽ có thể tạo ra một trang admin tiện lợi nhất.
Cài đặt
Trong Gemfile
gem 'activeadmin'
Sau khi thực hiện cài đặt gem, ta sẽ có một số thao tác cơ bản như sau
Nếu muốn sử dụng một lớp với tên là user, ta cung cấp cho nó với tham số:
rails g active_admin:install User
Còn nếu không chỉ định, ta sẽ nhận được một lớp với tên mặc định là AdminUser để sử dụng với Devise.
rails g active_admin:install
Ta thêm một số lớp cần thiết
app/admin/dashboard.rb
app/assets/javascripts/active_admin.js
app/assets/stylesheets/active_admin.scss
config/initializers/active_admin.rb
Và sau đó chỉ cần chạy migrate và đăng nhập vào http://localhost:3000/admin
với user mặc định được cung cấp sẵn
User: admin@example.com
Password: password
Vậy là ta đã đăng nhập được vào trang quản trị hoàn toàn dễ dàng
Và giờ bắt tay tùy chỉnh để có một trang giao diện hoàn toàn phù hợp với nhu cầu sử dụng.
Trước tiên, ta thêm bảng Book vào active admin với câu lệnh
rails g active_admin:resource book
như vậy file books.rb
đã xuất hiện trong thư mục app/admin
và truy cập vào đường dẫn http://localhost:3000/admin/books
ta sẽ có giao diện đơn giản
Tùy chỉnh index
Hiển thị danh sách và thực hiện tìm kiếm là một trong những nhiệm vụ quan trọng trong việc xây dựng một trang quản trị dữ liệu. Và active admin cung cấp các chỉ mục index có sẵn:
-
Table: Một bảng được vẽ với mỗi hàng tương ứng là một bản ghi (trong cơ sở dữ liệu).
-
Grid: Một tập hợp các hàng và cột với mỗi ô là một bản ghi.
-
Blocks: Một tập hợp các hàng (không phải dưới dạng bảng) với mỗi hàng là một bản ghi.
-
Blog: Tiêu đề và nội dung chính.
Multiple Index Pages
Nếu bạn muốn nhiều hơn một trang chỉ mục cho tài nguyên sách của mình để hiển thị các chế độ xem khác nhau, bạn cần tạo nhiều chỉ mục trong lớp book của mình. Và nếu có nhiều trang chỉ mục, active admin sẽ tạo liên kết ở đầu trang chỉ mục mặc định.
index do
id_column
column :author
actions
end
index as: :grid do |book|
link_to image_tag(book.image_path), admin_book_path(book)
end
Và chỉ mục đầu tiên sẽ là trang chỉ mục mặc định. Còn nếu bạn không muốn điều đó, thì có thể sử dụng default: true
để thay đổi tùy ý.
index as: :grid, default: true
Khi bạn sử dụng index thì các danh sách hiển thị dữ liệu sẽ bao gồm các trường mà được khai báo trong index và được sắp xếp đúng như trong index. Còn nếu không có index, thì toàn bộ các trường sẽ xuất hiện trên danh sách đầy đủ với đúng thứ tự. Và với việc khai báo thêm actions
trong index, ta sẽ có được một hành động (có thể là thêm/ sửa/ xóa) trên từng hàng dữ liệu.
Index Filters
Theo mặc định, màn hình chính sẽ hiển thị các dữ liệu của books, và bên phải màn hình thực hiện tìm kiếm đối với từng trường dữ liệu đã khai báo cho bảng books (tham khảo hình trên). Để hiển thị bộ tìm kiếm cho từng thuộc tính của bảng, ta khai báo
ActiveAdmin.register Book do
filter :name_book
filter :price
end
Và lưu ý rằng, nếu bạn không khai báo bất kỳ một filter nào trong Book cũng đồng nghĩa với việc toàn bộ các trường trong books đều được hiển thị lên màn hình để có thể filter. Vì vậy, nếu không bỏ đi bất cứ trường nào của đối tượng, thì bạn có không nhất thiết phải khai báo filter. Và nó hữu ích với việc bạn chỉ muốn sử dụng một số trường nhất định.
Active admin hỗ trợ một số loại dữ liệu cho việc tìm kiếm
-
string: hiển thị một drop down để chọn các phần tử.
-
date_range: Nhập ngày bắt đầu và kết thúc với calendar
-
numeric: hiển thị một drop down để chọn các phần tử số.
-
select: hiển thị một drop down với các giá trị lựa chọn hoặc toàn bộ phần tử.
-
check_boxes: hiển thị check box và người dùng có thể bật và tắt để tìm kiếm.
Theo mặc định, nó sẽ chọn ra loại thuộc tính phù hợp cho từng trường. Và dĩ nhiên, ta cũng có thể thay đổi với tùy chọn :as
filter :author, as: :check_boxes
Cả hai loại check_boxes và select đều chấp nhận tùy chọn với collection. Bạn có thể sử dụng collection dưới dạng một Proc
filter :author, as: :check_boxes, collection: proc { Author.all }
Đôi khi bạn sẽ muốn thay đổi tên hiển thị của filter của trường thì bạn sẽ sử dụng tùy chọn label
filter :author, label: 'Something else'
Một lưu ý hữu ích và tiện lợi: Khi bạn muốn tìm kiếm nhiều thuộc tính sử dụng phuơng pháp tìm kiếm của Ransack
thì bạn cần phải chỉ định loại dữ liệu mà bạn tìm kiếm cùng với nhãn của nó
filter :name_or_author_cont, as: :string, label: "Name"
Như đã giới thiệu ở trên thì việc khai báo filter hoặc không khai báo cũng đều giúp ta có các bộ tìm kiếm cần thiết, còn nếu như bạn không muốn sử dụng nó, thì việc vô hiệu hóa nó sẽ được thực hiện đơn giản
ActiveAdmin.register Book do
config.filters = false
end
Hay đơn giản là bạn đang muốn thêm hoặc bớt đi một số trường của filter mà không làm ảnh hưởng đến bộ filter mặc định của gem
preserve_default_filters! //giữ nguyên filter mặc định
filter :author // thêm trường filter
remove_filter :id // loại bỏ trường filter
Index Scopes
Ta có thể định nghĩa một số scopes cho trang index.
scope :all, default: true
# model sử dụng ':active'
scope :active
# đổi tên model scope
scope "Subcategories", :leaves
# scope không được định nghĩa trên model
scope("Inactive") { |scope| scope.where(active: false) }
# điều kiện trong scope
scope "Published", if: -> { current_admin_user.can? :manage, Books } do |books|
books.published
end
Ngoài những tùy chỉnh nêu trên, ta cũng có một số tùy chỉnh đơn giản hơn như index default sort order
hoặc index pagination
ActiveAdmin.register Book do
config.sort_order = 'name_asc' //xác định thứ tự sắp xếp mặc định
config.per_page = 10 //cho phép số bản ghi hiển thị trên mỗi trang
config.per_page = [10, 50, 100] //cho phép hiển thị một dropdown với các giá trị tùy chọn trên
end
Và Active admin cũng cung cấp cho bạn một số giao diện có sẵn như tạo mới hay chỉnh sửa đối tượng mà bạn không cần phải thêm giao diện html nào cho nó. Chắc hẳn nó là một gem vô cùng hữu ích và tiện lợi rồi
Tài liệu tham khảo
All rights reserved