+5

Sử dụng gem active admin cho rails

Mở đầu

Ngoài rails_admin việc xây dưng admin cho 1 app ruby on rails nhỏ trở nên vô cùng đơn giản khi sử dụng gem active_admin.

Cài đặt

Ta sẽ chuẩn bị tạo trang admin manage đăng nhập với gem devise và 1 tý phân quyền cho tài khoản

# Gemfile
gem 'activeadmin'
gem 'devise'
gem 'cancancan'
rails generate active_admin:install

Migration:

class DeviseCreateAdminUsers < ActiveRecord::Migration[5.1]
  def change
    create_table :admin_users do |t|
      t.string :user_name,              null: false, default: ""
      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""
      t.integer :permission, null: false, default: 0
      t.datetime :remember_created_at

      t.timestamps null: false
    end

    add_index :admin_users, :user_name, unique: true
    add_index :admin_users, :email, unique: true
  end
end

Cách dùng

Đăng nhập admin với gem devise.

seeds.rb

AdminUser.create!(user_name: 'admin', email: 'admin@example.com', password: '123456', password_confirmation: '123456', permission: 1) if Rails.env.development?

Tạo resource

rails generate active_admin:resource AdminUsers

Tiếp theo sẽ là cấu hình và phân quyền.

config/initializers/active_admin.eb

config.comments = false
config.authorization_adapter = ActiveAdmin::CanCanAdapter

app/models/admin_users.rb

class AdminUser < ApplicationRecord
  devise :database_authenticatable, :rememberable, :validatable,
    authentication_keys: [:user_name]

  enum permission: {manager: 0, admin: 1}
end

Thêm phân quyền cho tài khoản admin.

app/models/ability.rb

class Ability
  include CanCan::Ability

  def initialize admin_user
    admin_user ||= AdminUser.new
    if admin_user.admin?
      can :manage, :all
    else
      can :read, :all
    end
  end
end

config/routes.rb

devise_for :admin_users, ActiveAdmin::Devise.config
  ActiveAdmin.routes(self)

Bây giờ coi như đã thử được rồi , cơ mà vẫn sửa chút nội dung trang quản lý.

app/admin/dashboard.rb

ActiveAdmin.register_page "Dashboard" do

  menu priority: 1, label: proc{I18n.t("active_admin.dashboard")}

  content title: proc{I18n.t("active_admin.dashboard")} do
    div class: "blank_slate_container", id: "dashboard_default_message" do
      span class: "blank_slate" do
        span I18n.t("active_admin.dashboard_welcome.welcome")
        small I18n.t("active_admin.dashboard_welcome.call_to_action")
      end
    end
  end
end

app/admin/admin_users.rb

ActiveAdmin.register AdminUser do
  permit_params :user_name, :email, :password, :password_confirmation

  index do
    selectable_column
    id_column
    column :user_name
    column :email
    column :created_at
    actions
  end

  filter :user_name
  filter :email
  filter :created_at

  form do |f|
    f.inputs do
      f.input :user_name
      f.input :email
      f.input :password
      f.input :password_confirmation
    end
    f.actions
  end
end

Thế là xong. đặp nhập và xem kết quả thôi.

lời kết

Quá nhanh quá nguy hiểm cho một app quản lý đơn tuần kiểu CRUD , Các bạn có thể lên trang https://activeadmin.info để đọc thêm. bạn nào còn thắc mắc về cách dùng khác - việc custom view, controller, helper, hay là thêm ảnh, nested attributes, sử dụng ckeditor ... thì comment để mình viết thêm 1 bài nha. Cảm ơn đã đọc bài. Mình tự đọc document để chạy app rồi viết bài chứ không sao chép, vui lòng không downvote !


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí