Customize rails_admin
Bài đăng này đã không được cập nhật trong 3 năm
Mở đầu
Trang admin quản lí dữ liệu luôn là một phần không thể thiếu của một trang web hay một ứng dụng. Tuy nhiên để xây dựng một trang admin quản lí hoàn chỉnh thì lại tốn rất nhiều thời gian và công sức. Đối với Ruby on Rails thì có một gem rất mạnh cho việc tạo một trang admin quản lí dữ liệu một cách nhanh chóng với khá đầy các chức năng cần thiết, đó là gem rails_admin
.
- Ưu điểm:
- Tạo trang admin quản lí dữ liệu một cách nhanh chóng, tốn ít thời gian và công sức
- Có đầy đủ các chức năng CRUD cho tất cả các model
- Nhược điểm:
- Gem tạo tất cả chức năng CRUD cho tất cả các model nên dẫn đến trang admin khá nặng
- Không phải là một phương án khả dĩ nếu muốn tạo một trang admin với quá nhiều requirements
Chính vì vậy việc sử dụng và custome lại rails_admin
là bước cần thiết để bạn có thể tạo một trang admin ưng ý
Cài đặt rails_admin Các bạn có thể xem hướng dẫn cài đặt cũng như sử dụng và custome ở link sau: https://viblo.asia/daothanhcam/posts/NPVMaDxQRQOk
Customize rails_admin
bài viết ở link trên đã hướng dẫn rất chi tiết việc cài đặt, cấu hình, cũng như customize một số các chức năng đối với rails_admin
. Sau đây mình sẽ đi thêm vào một số những customize hữu ích khác để có được trang admin như ý (hihi).
- Custom action:
-
Custom lại các action có sẵn của rails_admin:
ở đây ta thấy thời gian của field
created_at
hiển thị là thời gian với time_zone trên server. Giả sử trang admin của chúng ta có nhiều người cùng sử dụng và ở các nước khác nhau thì hiển thị này thật không tiện chút nào. Tôi sẽ cho thời gian hiển thị theo Time_zone của từng nước của admin đó. Ta thêm đoạn code sau trong fileconfig/initializers/rails_admin.rb
:
-
module RailsAdmin
module Config
module Fields
module Types
class Datetime < RailsAdmin::Config::Fields::Base
def value
value_in_default_time_zone = bindings[:object].send(name)
return nil if value_in_default_time_zone.nil?
pacific_time_zone = current_user.get_time_zone
value_in_default_time_zone.in_time_zone(pacific_time_zone)
end
end
end
end
end
end
Và đây là kết quả:
Giờ đây, tất cả các field về Datetime
sẽ hiển thị thời gian theo time_zone của từng admin. tiện lợi phải không nào (hehe)
- Như ở hình trên ta có thể thấy đối với mỗi record ta sẽ có 3 action là : view, edit và delete.
Sẽ có nhưng thứ nguy hiểm mà chúng ta không muốn an đó lỡ tay xóa nhầm (haha), vì vậy cần có việc xử lí để loại bỏ action delete đi. Cách sử dụng gem
cancancan
như bài viết ở trên là sử dụng cho từng role admin, tuy nhiên cũng có những req ko liên quan đến role admin mà nó liên quan đến model. Ví dụ như nếu là một trang admin bán hàng chẳng hạn, thì tôi sẽ không muốn ai xóa đi đơn hàng. ở đây tôi sẽ ví dự để ẩn đi action delete đối với model admins. Thêm đoạn code sau:
RailsAdmin.config do |config|
config.actions do
delete do
except ["Admin"]
end
end
end
Và đây là kết quả:
- Ok bây giờ chúng ta sẽ tạo thêm một action nữa cho chúng trang admin nào:
- Có 3 loại scope của actions trong rails_admin:
- root: action có scope root ( ví dụ như : dashboard ...)
- collection: action có scope collection ( ví dụ như : index, New,...)
- member: action có scope member ( ví dụ như : show, edit, delete ...)
Đầu tiên các bạn tạo file controller cho action: trong thư mục
/lib/rails_admin/my_action.rb
- Có 3 loại scope của actions trong rails_admin:
require 'rails_admin/config/actions'
require 'rails_admin/config/actions/base'
module RailsAdmin
module Config
module Actions
class MyAction < RailsAdmin::Config::Actions::Base
#Logic for your action is here (yaoming)
end
end
end
end
Sau đó tạo file view cho action cảu bạn trong thư mục app/views/rails_admin/main/my_action.html
Để sử dụng bạn thêm đoạn code sau vào file config/initializers/rails_admin.rb
- Nếu muốn nó ở dạng collection: ví dụ thêm thống kê cho admin
config.actions do
collection :my_action do
only Admin
end
end
Và đây là kết quả nhận được:
Nếu bạn muốn 1 action như kiểu preview
sản phẩm trên website: config như sau
config.actions do
merber :my_action do
only Admin
end
end
Và đây là kết quả:
Đối với controller và view của my_action thì bạn code cho các nghiệp vụ mà bạn cần nhé (hehe)
Bài viết xin tạm kết ở đây, vậy là ta đã có thể tạo ra 1 trang admin với các tính năng tương đối rồi. Cái này rất hợp dành cho các app ko đặt quá nhiều yêu cầu vào trang admin
All rights reserved