RailsAdmin | Railsで管理画面を自動生成


RailsAdminは、簡単に、キレイな、扱いやすい管理画面を提供してくれるRailsエンジンです。
![RailsAdmin](https://raw.github.com/FakeStarBaby/fakeimg/master/rails_admin.png "RailsAdmin")

## リソース

* [Demo](http://rails-admin-tb.herokuapp.com)
* [GitHub](https://github.com/sferik/rails_admin)
* [RubyGems.org](http://rubygems.org/gems/rails_admin)
* [The Ruby Toolbox](https://www.ruby-toolbox.com/projects/rails_admin)

## インストール

RailsAdminは、管理画面にアクセスする管理者の管理に[Devise](https://github.com/plataformatec/devise)を利用しています。
その為、まずは、Deviseをインストールしておきましょう。

Gemfileに、deviseを追記します。

```ruby:Gemfile
gem 'devise'
```

インストールします。

```bash
$ bundle install
$ rails g devise:install
      create  config/initializers/devise.rb
      create  config/locales/devise.en.yml
===============================================================================

Some setup you must do manually if you haven't yet:

  1. Ensure you have defined default url options in your environments files. Here 
     is an example of default_url_options appropriate for a development environment 
     in config/environments/development.rb:

       config.action_mailer.default_url_options = { :host => 'localhost:3000' }

     In production, :host should be set to the actual host of your application.

  2. Ensure you have defined root_url to *something* in your config/routes.rb.
     For example:

       root :to => "home#index"

  3. Ensure you have flash messages in app/views/layouts/application.html.erb.
     For example:

       <p class="notice"><%= notice %></p>
       <p class="alert"><%= alert %></p>

  4. If you are deploying Rails 3.1 on Heroku, you may want to set:

       config.assets.initialize_on_precompile = false

     On config/application.rb forcing your application to not access the DB
     or load models when precompiling your assets.

===============================================================================
```

上記の警告メッセージの内、フラッシュメッセージの表示ロジックのみ、レイアウトファイルに追記します。

```ruby:app/views/layouts/application.html.erb
<!DOCTYPE html>
<html>
<head>
  <title>SampleRailsAdmin</title>
  <%= stylesheet_link_tag    "application", :media => "all" %>
  <%= javascript_include_tag "application" %>
  <%= csrf_meta_tags %>
</head>
<body>

<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>

<%= yield %>

</body>
</html>
```

本来であれば、RailsAdminをインストールする時に、関連する管理者モデルを自動生成してくれるはずなのですが、正常にジェネレーターが動作しないようなので、先にDeviseで管理者モデルを自動生成します。

```bash
$ rails g devise admin_user
      invoke  active_record
      create    db/migrate/20120802102400_devise_create_admin_users.rb
      create    app/models/admin_user.rb
      insert    app/models/admin_user.rb
       route  devise_for :admin_users
```

管理者は直接DBに登録するようにしたい為、管理者モデルファイルから`:registerable`と`:recoverable`の指定を外します。

```ruby:app/models/admin_user.rb
class AdminUser < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :confirmable,
  # :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :rememberable, :trackable, :validatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me
  # attr_accessible :title, :body
end
```

同様に、マイグレーションファイルから関連するロジックをコメントアウトします。

```ruby:db/migrate/20120802102400_devise_create_admin_users.rb
class DeviseCreateAdminUsers < ActiveRecord::Migration
  def change
    create_table(:admin_users) do |t|
      ...

      ## Recoverable
      # t.string   :reset_password_token
      # t.datetime :reset_password_sent_at

      ...
    end

    ...
    # add_index :admin_users, :reset_password_token, :unique => true
    ...
  end
end
```

マイグレーションします。

```bash
$ rake db:migrate
```

さて、ここからRailsAdminのインストールです。
本来であれば、ここまで全てRailsAdminがお世話してくれるはずなんですけどね。

Gemfileに、rails_adminを追記します。

```ruby:Gemfile
gem 'rails_admin'
```

インストールします。
途中で、管理者モデルとして何を使うかと聞いて来るので`admin_user`を、管理画面をマウントするパスをどうするか聞いてくるので`admin`と答えます。

```bash
$ bundle install
$ rails g rails_admin:install
           -  Hello, RailsAdmin installer will help you sets things up!
           -  I need to work with Devise, let's look at a few things first:
           -  Checking for a current installation of devise...
           -  Found it!
           -  Looks like you've already installed it, good!
           -  And you already set it up, good! We just need to know about your user model name...
           -  We found 'admin_user' (should be one of 'user', 'admin', etc.)
           ?  Correct Devise model name if needed. Press <enter> for [admin_user] > 
           -  Ok, Devise looks already set up with user model name 'admin_user':
           -  Now you'll need an initializer...
      create  config/initializers/rails_admin.rb
           -  Adding a migration...
      create  db/migrate/20120802103609_create_rails_admin_histories_table.rb
           ?  Where do you want to mount rails_admin? Press <enter> for [admin] > 
        gsub  config/routes.rb
       route  mount RailsAdmin::Engine => '/admin', :as => 'rails_admin'
```

RailsAdminが利用する履歴モデルのマイグレーションファイルが自動生成されているので、もう一度、マイグレーションします。

```bash
$ rake db:migrate
```

## 利用方法

まず、管理者をDBに登録します。

```bash
$ rails c
Loading development environment (Rails 3.2.7)
1.9.3p194 :001 > AdminUser.create(:email => "admin@test.com", :password => "hogehoge", :password_confirmation => "hogehoge")
   (0.1ms)  begin transaction
  AdminUser Exists (0.1ms)  SELECT 1 AS one FROM "admin_users" WHERE "admin_users"."email" = 'admin@test.com' LIMIT 1
  SQL (1.9ms)  INSERT INTO "admin_users" ("created_at", "current_sign_in_at", "current_sign_in_ip", "email", "encrypted_password", "last_sign_in_at", "last_sign_in_ip", "remember_created_at", "reset_password_sent_at", "reset_password_token", "sign_in_count", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)  [["created_at", Thu, 02 Aug 2012 10:46:25 UTC +00:00], ["current_sign_in_at", nil], ["current_sign_in_ip", nil], ["email", "admin@test.com"], ["encrypted_password", "$2a$10$spWm6E8m2s8w7OVDfaQo0Ogn1K4EbpVNP7wD3nUF476Evdtf6fKtC"], ["last_sign_in_at", nil], ["last_sign_in_ip", nil], ["remember_created_at", nil], ["reset_password_sent_at", nil], ["reset_password_token", nil], ["sign_in_count", 0], ["updated_at", Thu, 02 Aug 2012 10:46:25 UTC +00:00]]
   (0.8ms)  commit transaction
 => #<AdminUser id: 1, email: "admin@test.com", encrypted_password: "$2a$10$spWm6E8m2s8w7OVDfaQo0Ogn1K4EbpVNP7wD3nUF476E...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 0, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil, created_at: "2012-08-02 10:46:25", updated_at: "2012-08-02 10:46:25"> 
```

サーバーを起動して、`http://localhost:3000/admin`にアクセスすると、ログイン画面が表示されます。
先程、登録した管理者のメルアドとパスワードを入力してログインすると、管理画面のダッシュボードが表示されます。

モデルは自動的にRailsAdminによって読み込まれる為、特に小難しい事さえしなければ、この状態でどんどん新しいモデルを管理出来るようになります。

使い勝手が知りたければ、公式に[Demo](http://rails-admin-tb.herokuapp.com)が用意されているので、こちらで試してみるのも良いでしょう。

## あわせて読みたい

* [rails_admin を使った管理画面の作成 | 篳篥日記](http://d.hatena.ne.jp/hichiriki/20120126)
* [Rails3 で管理画面を作成するなら RailsAdmin で決まりかも | present](http://d.hatena.ne.jp/griefworker/20120628/rails_admin)