2020年5月18日月曜日

簡易SNSを作ってみよう(16)

管理画面の作成
現在のバージョンでは,データの管理にはコンソールから操作するか,データベースを直接いじらなければならない.不適切な投稿があったときに削除できるように,管理画面を用意する.
Administrateのインストール
管理画面を簡単に作ってくれるgemであるAdministrateをインストールする.以下の手順でルーティングの設定まで自動でやってくれる.なお,そのままだとエラーが出るため,設定ファイルに若干の追記を行う.
【手順】
vi Gemfile
(以下を追記)
gem 'administrate'

bundle install
bin/rails g administrate:install
vi config/initializers/assets.rb
(以下を追記)
Rails.application.config.assets.precompile += 
    %w( administrate/application.js administrate/application.css )

bin/rails assets:precompile
Administrateのテスト
サーバを起動し,http://localhost:3000/adminにアクセスする.管理画面が出てきたらOK.

アクセスコントロール
このままだと誰でも管理画面にアクセスできてしまうので,下記の修正を行い(とりあえずは)先生だけが管理画面にアクセスできるようにする.

【手順】
vi app/controllers/admin/application_controller.rb
(以下を追記)
module Admin
  class ApplicationController < 
Administrate::ApplicationController
    before_action :authenticate_admin

    def authenticate_admin
      # TODO Add authentication logic here.
      redirect_to '/', alert: 'Not authorized.' \
        unless current_user && current_user.role == 'teacher'
    end

    # Override this value to ...
    # on index pages. Defaults to 20.
    # def records_per_page
    #   params[:per_page] || 20
    # end
  end
end

管理画面のカスタマイズ
このままでは管理画面が見づらいので,ちょっとしたカスタマイズを行い見やすくする.
【手順】

vi app/dashboards/user_dashboard.rb
(以下を修正)
class UserDashboard < Administrate::BaseDashboard
  # ATTRIBUTE_TYPES
  # a hash that describes the type of each of the model's fields.
  #
  # Each different type represents an Administrate::Field object,
  # which determines how the attribute is displayed
  # on pages throughout the dashboard.
  ATTRIBUTE_TYPES = {
    posts: Field::HasMany,
    visits: Field::HasMany,
    id: Field::Number,
    #email: Field::String,
    #encrypted_password: Field::String,
    #reset_password_token: Field::String,
    #reset_password_sent_at: Field::DateTime,
    #remember_created_at: Field::DateTime,
    #created_at: Field::DateTime,
    #updated_at: Field::DateTime,
    username: Field::String,
    fullname: Field::String,
    password: Field::Password,
    role: Field::String,
  }.freeze

  # COLLECTION_ATTRIBUTES
  # ...
  # Feel free to add, remove, or rearrange items.
  COLLECTION_ATTRIBUTES = %i[
  id
  username
  fullname
  posts
  ].freeze

  # SHOW_PAGE_ATTRIBUTES
  # an array ....
  SHOW_PAGE_ATTRIBUTES = %i[
  id
  username
  fullname
  role
  ].freeze

  # FORM_ATTRIBUTES
  # an array of attributes that will be displayed
  # on the model's form (`new` and `edit`) pages.
  FORM_ATTRIBUTES = %i[
  username
  fullname
  password
  role
  ].freeze

ページネーションの表示が崩れているのでそれを修正する.Bootstrap4対応のKaminariではなくdefaultのKaminariファイルを必要とするので,quick hackではあるが一度そのファイルを生成してAdministrate用に置いたあと,再度,Bootstrap4に合わせたページネーション用ファイルを生成するということをやる.
【手順】

bin/rails g administrate:views:index
vi app/views/admin/application/index.html.erb
(以下を追加)
<%= paginate resources, views_prefix: 'admin' %>

bin/rails g kaminari:views default -f
mkdir app/views/admin/kaminari
mv app/views/kaminari/* app/views/admin/kaminari/
bin/rails g kaminari:views bootstrap4

Administrateのテスト(2)
サーバを起動し,http://localhost:3000/admin にアクセスする.user000でログインしたとき「のみ」管理画面にアクセスできることを確認する.

0 件のコメント:

コメントを投稿