Devise + activeadmin

activeadmin用來作為後台管理介面,可以輕易地為你的model加上CURD的功能

安裝所需要的gem

gemfile.rb
gem 'devise'
gem 'activeadmin', '~> 1.0.0.pre2'
gem 'cancancan'

這邊有個要注意的地方是我一開始在安裝activeadmin的時候有出現這個錯誤訊息

Resolving dependencies....
Your Gemfile requires gems that depend on each other, creating an infinite loop.
Please remove gem 'meta_search' and try again.

錯誤的原因是因為沒有加版本號,我只寫了gem 'activeadmin'而已,所以要記得要加版本號。

執行bundle install

建立檔案

這邊是會用devise所建立出來的user來代替activeadmin所建立出來adminUser,簡單的來說就是devise跟activeadmin用相同的user model。

devise

rails g devise:install
rails g devise user
###在user model多加一個叫做role的欄位
rails g migration add_role to users role:string

修改migration檔案

db/migration/AddRoleToUsers.rb
class AddRoleToUsers < ActiveRecord::Migration
  def change
    add_column :users, :role, :string
  end
end

執行 bundle install

建立一個有admin權限的user

在rails c裡輸入

 User.create(email: "your_email", password: "your_password", password_confirmation: "your_password" , role: "admin")

ActiveAdmin

rails generate active_admin:install --skip-users

設定active_admin

config/initializers/active_admin.rb
config.authentication_method = :authenticate_active_admin_user!
config.current_user_method   = :current_user
config.logout_link_path      = :destroy_user_session_path
config.logout_link_method    = :delete

在application_controller加上authenticate_active_admin_user! method

app/controllers/application_controller.rb
def authenticate_active_admin_user!
   authenticate_user!
   unless current_user.has_role 'admin'
      flash[:alert] = You are not authorized to access this resource!"
      redirect_to root_path
   end
end

如何使用activeadmin

1.首先你要先建立一個model(上面我們已經有建立一個user model了)。
2.註冊你的model到activeadmin裡面使用,之後就會在app/admin/底下建立出相對應的檔案,之後就可以在這個檔案裡去設定你要的功能及畫面。

#rails generate active_admin:resource YOUR_MODEL_NAME
rails generate active_admin:resource user

設定後台畫面

activeadmin documentation有教很多怎麼客製化view及客製化controller還有其他組件,建議在用activeadmin之前可以來這邊看看,網站上也有demo可以玩玩看。我這邊就先把剛剛所建立的user後台畫面簡單的設定一下。

app/admin/user.rb
##設定在rails4裡所需要的Strong Parameter

permit_params :email, :password, :password_confirmation, :role
##設定user後台的畫面會有哪些欄位資料

  index do
      column :email
      column :current_sign_in_at
      column :last_sign_in_at
      column :sign_in_count
      column :role
      #actions是會在每筆資料後面加上view,edit,delete的編輯選項

      actions
  end
  #畫面右邊會出現filter功能,後面的欄位就是看你要用什麼欄位當作條件。

  filter :email
  #這個form就是用來修改用的如果沒有用特定的block包起來的話這個form就是通用在edit,new這兩個action

  form do |f|
      f.inputs "User Details"  do
          f.input :email
          f.input :password
          f.input :password_confirmation
          f.input :role, as: :radio, collection: {None: "none", Administrator: "admin"}
      end

      f.actions
  end

設定好畫面之後就可以去CRUD一下user了。

如何移除filter?

如果不要有filter功能的話是不是把filter這行刪掉就可以了呢?歹幾不是像憨人你想得這麼簡單,如果把filter這行拿地的話就會用user的所有欄位當作filter條件,整個filter視窗就會看起來超長一條。正確的做法是這樣做

app/admin/user.rb
- filter :email

+ config.filters = false

如果要全部的view都不要filter的話那就去修改config/initializers/active_admin.rb,在最後一行把註解打開然後改成false就好了。

結尾

activeadmin得功能很多,我也還沒全部玩完,有玩到的話會再補東西上來,然後railscast的activeadmin教學非常建議去看一下還蠻有用的。

參考資料

Active Adminドキュメント日本語版
Deviseインストール済環境でActiveAdminの導入
devise-cancan-and-activeadmin

comments powered by Disqus