Step by Step Ruby on Rails

Ruby on Railsで実際にWebサイトを構築する手順をまとめています。

Active Adminでモデルを登録、表示設定をする方法

Active Adminでモデルを登録、表示設定をする方法をまとめました。
下記記事の方法でインストール、初期設定をしている事を前提としています。
Active Adminのインストール方法
 
(1)モデルの登録
 
1)デモ用のモデル登録
 
下記コマンドで各モデルを登録します。
rails generate active_admin:resource Genre
rails generate active_admin:resource Author
rails generate active_admin:resource Book
 
2)ブラウザで確認
 
Active Adminの管理画面の上部メニューに上記3つのモデルが登録されたことを確認します。
 
3)データ登録
 
①db/seeds.rbにデータ記述
 
db/seeds.rbファイルに下記のようにデータを登録します。
ya = Genre.create! :name => "Young Adult"
 :
 
②rake db:seed実行
 
4)ブラウザで確認
 
各モデルのメニューをクリックし、データが登録されていることを確認します。
 
(2)Active Admin管理インタフェース上でのモデルの表示内容を変更
 
Booksのページの表示を変更してみます。
 
1)デフォルトの表示内容
 
Booksは下記カラムを持っていますが
id、name、price、author_id、genre_id、created_at、updated_at
 
表示されているのは、
id、name、price、created_at、updated_at
になっています。
 
2)表示項目を変更
 
created_at、updated_atの項目を削除し、author_id、genre_idを追加してます。
 
$ vi app/admin/book.rb

index do
  column :name
  column :author
  column :genre
  column :price
  default_actions
end

※default_actionsを指定すると"View"、"Edit"、"Destroy"のリンクが追加されます。
 
3)表示確認
 
Active Adminの管理画面でBooksモデルの表示内容を確認します。
 
①genre
 
Booksモデルが持つカラムはgenre_idですが、belongs_to :genreのアソシエーションを定義しているのでgenre_idからジャンル名を取得し表示出来ています。
 
②author
 
Author #11のように表示され、著者名が正しく表示されていません。
 
管理画面右のFilters部分、AUTHORのドロップダウンをクリックすると#<Author:0x000・・・>のように表示されています。
 
外部キーから取得したオブジェクトからどのように名前を表示するかは下記設定で決められています。
 
lib/active_admin/application.rb

# Active Admin makes educated guesses when displaying objects, this is
# the list of methods it tries calling in order
setting :display_name_methods, [ :display_name,
                                  :full_name,
                                  :name,
                                  :username,
                                  :login,
                                  :title,
                                  :email,
                                  :to_s ]

上記設定に従って上から順に属性の取得を試みます。genreはname属性を持っていたので正しく表示されましたが、authorは上記リストの属性を持っていなかったのでうまく表示出来ませんでした。
 
4)authorモデルにto_sメソッドを定義
 
管理画面のbookビューに著差名が表示されるようにto_sメソッドを定義します。
 
$ vi app/models/author.rb

  def to_s
  "#{first_name} #{last_name}"
  end

この設定で著者名が正しく表示されるようになりました。
 
5)価格を通貨で表示
 
価格が数値で表示されているので通貨に修正します。
 
$ vi app/admin/book.rb

index do
  column :name
  column :author
  column :genre
  column :price do |product|
    number_to_currency product.price, unit: "¥"
  end
  default_actions
end