公式サイト
ハンズオン
sudo apt-get install -y ruby-railties bundler libsqlite3-dev
rails new act1
cd act1
+ 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
ログイン
http://localhost:3000/admin/login
にアクセス
AdminUser.create!(email: 'admin@example.com', password: 'password', password_confirmation: 'password') if direction == :up
とのことなので
- admin@example.com
- password
でログイン
ログイン成功
modelを作成
./bin/rails g scaffold Hoge name:string age:integer
./bin/rake db:migrate
./bin/rails generate active_admin:resource Hoge
上のメニューにHoge
が追加された。
newから登録すると以下エラーになるので対策
ActiveModel::ForbiddenAttributesError in Admin::HogesController#create
ActiveAdmin.register Hoge do
+ permit_params :name, :age
end
登録できた。
databaseの中身確認
./db/development.sqlite3
に保存されています。
sudo apt-get install -y sqlite3
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
もしくは
Devise.setup do |config|
# config.secret_key = 'e7d789bbdb8...
+ config.secret_key = 'エラーメッセージに表示されたものをそのまま貼り付け'
end
bin/rake db:migrate RAILS_ENV=production
precompile
- 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モードで、なかなかソースの修正が反映されないと思っていたら再起動してない、ということが起きたりするので、意識しないといけませんね。
アカウントの管理
もしくは手動で追加
$ bin/rails c
pry(main)> AdminUser.create!(:email => 'user1@example.com', :password => 'password', :password_confirmation => 'password')
ログインしたら任意のページを表示させる
- # config.root_to = 'dashboard#index'
+ config.root_to = 'hoges#index'
大メニューにぶら下げる
ActiveAdmin.register Hoge do
permit_params :name, :age
+ menu parent: "大メニュー", label: "Hoge", priority: 3
end
CSVアップロード
+ gem 'active_admin_importable'
bundle install --path vendor/bundle
ActiveAdmin.register Hoge do
+ active_admin_importable do |model, hash|
+ model.create(name: hash[:name], age: hash[:age])
+ end
end
- 右上に
Import Hoge
が追加される - サンプルデータ作成
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
エラー
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
表示のカスタマイズ
ソート順を指定
ActiveAdmin.register Hoge do
+ config.sort_order = "name_asc"
end
削除できなくする
ActiveAdmin.register Hoge do
+ actions :all, :except => [:destroy]
end
-
delete
リンクがなくなったことを確認。
表示カラムの指定
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
という指定だった。
タイトルの変更
ActiveAdmin.setup do |config|
+ config.site_title = "管理画面"
end
日付フォーマット
en:
hello: "Hello world"
+ date:
+ formats:
+ long: "%Y-%m-%d"
+ time:
+ formats:
+ long: "%Y-%m-%d %H:%M:%S"
TimeZone
module Act
class Application < Rails::Application
+ config.time_zone = 'Tokyo'
end
end
paperclip
sudo apt-get install -y imagemagick
+ gem 'paperclip'
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
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
が出た場合は
./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);
+ <div class="field">
+ <%= f.label :avatar %><br>
+ <%= f.file_field :avatar %>
+ </div>
class HogesController < InheritedResources::Base
private
def hoge_params
- params.require(:hoge).permit(:name, :age)
+ params.require(:hoge).permit(:name, :age, :avatar)
end
end
途中...