Customize rails_admin

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: Screenshot from 2016-04-28 16:37:55.png

      ở đâ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 file config/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ả:

Screenshot from 2016-04-28 16:45:09.png

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ả: Screenshot from 2016-04-28 16:55:03.png

  • 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
    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: Screenshot from 2016-04-28 17:18:28.png

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ả: Screenshot from 2016-04-28 17:22:25.png

Đố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 😄