LoginSignup
26

More than 5 years have passed since last update.

Active Admin使ってみた

Last updated at Posted at 2015-07-07

公式サイト

ハンズオン

sudo apt-get install -y ruby-railties bundler libsqlite3-dev
rails new act1
cd act1
Gemfile
+ gem 'activeadmin', github: 'gregbell/active_admin'
+ gem 'devise'
bundle install --path vendor/bundle
./bin/rails g active_admin:install
./bin/rake db:migrate
./bin/rails s

ログイン

a1.png

http://localhost:3000/admin/login
にアクセス

db/migrate/20150707221710_devise_create_admin_users.rb
AdminUser.create!(email: 'admin@example.com', password: 'password', password_confirmation: 'password') if direction == :up

とのことなので

でログイン

ログイン成功

a2.png

modelを作成

./bin/rails g scaffold Hoge name:string age:integer
./bin/rake db:migrate
./bin/rails generate active_admin:resource Hoge

a3.png

上のメニューにHogeが追加された。

newから登録すると以下エラーになるので対策

ActiveModel::ForbiddenAttributesError in Admin::HogesController#create

app/admin/hoge.rb
  ActiveAdmin.register Hoge do
+   permit_params :name, :age
  end

登録できた。

a4.png

databaseの中身確認

./db/development.sqlite3

に保存されています。

sudo apt-get install -y sqlite3
sqlite3 ./db/development.sqlite3
./db/development.sqlite3の中身
  sqlite> .schema
  CREATE TABLE "schema_migrations" ("version" varchar(255) NOT NULL);
  CREATE UNIQUE INDEX "unique_schema_migrations" ON "schema_migrations" ("version");
  CREATE TABLE "admin_users" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "email" varchar(255) DEFAULT '' NOT NULL, "encrypted_password" varchar(255) DEFAULT '' NOT NULL, "reset_password_token" varchar(255), "reset_password_sent_at" datetime, "remember_created_at" datetime, "sign_in_count" integer DEFAULT 0 NOT NULL, "current_sign_in_at" datetime, "last_sign_in_at" datetime, "current_sign_in_ip" varchar(255), "last_sign_in_ip" varchar(255), "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL);
  CREATE UNIQUE INDEX "index_admin_users_on_email" ON "admin_users" ("email");
  CREATE UNIQUE INDEX "index_admin_users_on_reset_password_token" ON "admin_users" ("reset_password_token");
  CREATE TABLE "active_admin_comments" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "namespace" varchar(255), "body" text, "resource_id" varchar(255) NOT NULL, "resource_type" varchar(255) NOT NULL, "author_id" integer, "author_type" varchar(255), "created_at" datetime, "updated_at" datetime);
  CREATE INDEX "index_active_admin_comments_on_namespace" ON "active_admin_comments" ("namespace");
  CREATE INDEX "index_active_admin_comments_on_author_type_and_author_id" ON "active_admin_comments" ("author_type", "author_id");
  CREATE INDEX "index_active_admin_comments_on_resource_type_and_resource_id" ON "active_admin_comments" ("resource_type", "resource_id");
+ CREATE TABLE "hoges" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar(255), "age" integer, "created_at" datetime, "updated_at" datetime);

sqlite> select * from hoges;
1|おなまえ|18|2015-07-07 22:30:28.662739|2015-07-07 22:30:28.662739
sqlite> select * from active_admin_comments;
1|admin|コメントとか|1|Hoge|1|AdminUser|2015-07-07 22:33:04.617053|2015-07-07 22:33:04.617053
2|admin|コメント追記|1|Hoge|1|AdminUser|2015-07-07 22:33:33.216429|2015-07-07 22:33:33.216429

productionで動かしてみる

dbのmigrate

developmentではなくproductionで動かす場合、

bin/rake db:migrate RAILS_ENV=production

Devise.secret_key was not set. Please add the following to your Devise initializer:

と出るため以下実施

bin/rake secret

もしくは

config/initializers/devise.rb
  Devise.setup do |config|
    # config.secret_key = 'e7d789bbdb8...
+   config.secret_key = 'エラーメッセージに表示されたものをそのまま貼り付け'
  end
これで通るようになる。
bin/rake db:migrate RAILS_ENV=production

precompile

config/environments/production.rb
- config.serve_static_assets = false
+ config.serve_static_assets = true
bin/rake assets:precompile RAILS_ENV=production

起動

SECRET_KEY_BASE=$(./rake secret) ./bin/rails s -eproduction
  • 本番のときは、SECRET_KEY_BASEは環境変数に設定し、起動するたびに変更しない
  • db/production.sqlite3 に値が保存されることを確認。
$ sqlite3 db/production.sqlite3 "select * from hoges"
1|なまえ1|22|2015-07-07 22:55:07.971142|2015-07-07 22:55:07.971142

development/productionの違い

production :
 ・サーバーを再起動しないとコードの変更は反映されない
 ・Rails本来の性能が出る(レスポンスが良くなる)。

development:
 ・appフォルダ以下のコードを変更すると、サーバー再起動せずに、変更内容が即座に反映される。
 ・レスポンスが悪い(productionに比べ)。

つまり、developmentにしておくとサーバ再起動が不要なので、ソースをちょこちょこ変更しながら動作確認を行うような開発時には好都合で、本番環境では動作性能のよいproductionを使用すべきということになります。
例えばproductionモードで、なかなかソースの修正が反映されないと思っていたら再起動してない、ということが起きたりするので、意識しないといけませんね。

アカウントの管理

aaccount.png

もしくは手動で追加

$ bin/rails c
pry(main)> AdminUser.create!(:email => 'user1@example.com', :password => 'password', :password_confirmation => 'password')

ログインしたら任意のページを表示させる

config/initializers/active_admin.rb
- # config.root_to = 'dashboard#index'
+ config.root_to = 'hoges#index'

大メニューにぶら下げる

app/admin/hoge.rb
  ActiveAdmin.register Hoge do
    permit_params :name, :age
+   menu parent: "大メニュー", label: "Hoge", priority: 3
  end

a5.png

CSVアップロード

Gemfile
+ gem 'active_admin_importable'
bundle install --path vendor/bundle
app/admin/hoge.rb
  ActiveAdmin.register Hoge do
+   active_admin_importable do |model, hash|
+     model.create(name: hash[:name], age: hash[:age])
+   end
  end

a6import.png

  • 右上にImport Hogeが追加される
  • サンプルデータ作成
a.sh
echo "name,age"
for i in `seq 1 100`
do
  echo "user$i,$i"
done
sh a.sh > a.csv

取り込み実施

csvファイルをインポートしたら"\xEF" from ASCII-8BIT to UTF-8エラー

aerr.png

app/admin/hoge.rb
  ActiveAdmin.register Hoge do
    active_admin_importable do |model, hash|
-     model.create(name: hash[:name], age: hash[:age])
+     model.create(name: hash[:name].encode('UTF-8', 'UTF-8'), age: hash[:age].encode('UTF-8','UTF-8'))
+     // もしくは
+     model.create(name: hash[:name].force_encoding('UTF-8'), age: hash[:age].force_encoding('UTF-8'))
    end
  end

表示のカスタマイズ

ソート順を指定

app/admin/hoge.rb
  ActiveAdmin.register Hoge do
+  config.sort_order = "name_asc"
  end

削除できなくする

app/admin/hoge.rb
  ActiveAdmin.register Hoge do
+  actions :all, :except => [:destroy] 
  end
  • deleteリンクがなくなったことを確認。

a7destroy.png

表示カラムの指定

a8.png

app/admin/hoge.rb
  ActiveAdmin.register Hoge do
+   index do
+     column :id
+     column :name
+     column "年齢", :age
+     column :created_at
+     column :updated_at
+     actions
+   end
  end
  • actions でview,editのリンクを表示。
  • ageカラムの表示を年齢に変更
  • 昔はdefault_actionsという指定だった。

タイトルの変更

config/initializers/active_admin.rb
  ActiveAdmin.setup do |config|
+   config.site_title = "管理画面"
  end

a9.png

日付フォーマット

config/locales/en.yml
  en:
    hello: "Hello world"
+   date:
+     formats:
+       long: "%Y-%m-%d"
+   time:
+     formats:
+       long: "%Y-%m-%d %H:%M:%S"

a10date.png

TimeZone

config/application.rb
  module Act
    class Application < Rails::Application
+     config.time_zone = 'Tokyo'
    end
  end

paperclip

sudo apt-get install -y imagemagick
Gemfile
+ gem 'paperclip'
app/models/hoge.rb
  class Hoge < ActiveRecord::Base
+   has_attached_file :avatar, :styles => { :medium => "300x300>", :thumb => "100x100>" }, :default_url => "/images/:style/missing.png"
+   validates_attachment_content_type :avatar, :content_type => /\Aimage\/.*\Z/
  end
./bin/rails g migration add_avatar_to_hoges
db/migrate/2015070*_add_avatar_to_hoges.rb
  class AddAvatarToHoges < ActiveRecord::Migration
+   def change
+     add_attachment :hoges, :avatar
+   end
  end
./bin/rake db:create db:migrate

rollback方法

もしなかったことにしたい場合は./bin/rake db:rollbackで戻せる。

ActiveRecord::PendingMigrationError

が出た場合は

databaseの中身が消えます!!
./bin/rake db:rollback
./bin/rake db:migrate:reset
  • app/models/hoge.rb から該当行を削除

続き

確認
$ sqlite3 db/development.sqlite3 ".schema hoges"
CREATE TABLE "hoges" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar(255), "age" integer, "created_at" datetime, "updated_at" datetime, "avatar_file_name" varchar(255), "avatar_content_type" varchar(255), "avatar_file_size" integer, "avatar_updated_at" datetime);
app/views/hoges/_form.html.erb
+ <div class="field">
+   <%= f.label :avatar %><br>
+   <%= f.file_field :avatar %>
+ </div>
app/controllers/hoges_controller.rb
  class HogesController < InheritedResources::Base
    private
      def hoge_params
-       params.require(:hoge).permit(:name, :age)
+       params.require(:hoge).permit(:name, :age, :avatar)
      end
  end

途中...

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26