Rails で文献管理システムを作ってみるよ(1/n)

この手の話はドコにでもありそうですが(笑) 近場で Rails 弄り始めた人々がいるので, 以前から作っていたコードとかを晒し始めてみます.

やりたい事はそんなに大変な事ではなくて.

  • 論文(電子ジャーナル)を管理したい.
  • 取得した PDF を適切なディレクトリに保管したい.
  • 著者名, ジャーナル名, タイトル名で検索したい.
  • 某所で仕様している文献カード形式(テキスト)で情報を出力したい.
  • 選択したファイルの文献情報を tex の bib 形式で出力したい.
  • 簡単なコメント, レビュー文書を元の論文に関連づけて保存した.

かな. 見栄えもまあそれなりに弄りたいですけどね.

環境構築

OS は Debian GNU Linux(testing) です. 以前 Gfdnavi Home Page で, DebianRails 動かすために書いたドキュメントがありますので, それを参考に -> Gfdnavi を Debian GNU/Linux 4.0(etch) で動かす.

基本的には, rubygems のみ Debian パッケージを使用して, それ以外は gem 経由で install します.

 $ ruby -v
 ruby 1.8.7 (2008-06-20 patchlevel 22) [i486-linux]
 $ gem list
 *** LOCAL GEMS ***
 actionmailer (2.1.0)
 actionpack (2.1.0)
 activerecord (2.1.0)
 activeresource (2.1.0)
 activesupport (2.1.0)
 cgi_multipart_eof_fix (2.5.0)
 daemons (1.0.10)
 fastthread (1.0.1)
 gcalapi (0.1.1)
 gem_plugin (0.2.3)
 hpricot (0.6.161)
 icalendar (1.0.2)
 mongrel (1.1.5)
 mongrel_cluster (1.0.5)
 rack (0.4.0)
 rails (2.1.0)
 rake (0.8.1)
 refe (0.8.0.3)
 sqlite3-ruby (1.2.4)
 tmail (1.2.3.1)

関係無いものもまざってますが, 気にせずに.

プロジェクトの開始, リポジトリの作成

作るプログラムの名前は bookshelf にします. 今の所論文だけですけれど, 蔵書の管理もしたいので.

 $ rails bookshelf
      create
      create  app/controllers
      create  app/helpers
      create  app/models
      create  app/views/layouts
      ...
      create  log/server.log
      create  log/production.log
      create  log/development.log
      create  log/test.log

git リポジトリの作成

 $ cd bookshelf
 $ git init

gitignore の作成

 $ cat .gitignore
  #*#
  *.*~
  *~
  *.#*
  *.bk
  *.bak
  tags
  log/*.log
  tmp/**/*
  .DS_Store
  doc/api
  doc/app 
 $ touch tmp/.gitignore
 $ touch log/.gitignore

リポジトリにファイルの追加とコミット

 $ git add .
 $ git commit -m "initial import"

サーバへ転送するための裸(bare)リポジトリの作成, 転送

 $ git clone --bare . ~/tmp/bookshelf.git
 $ scp -r ~/tmp/bookshelf.git server@git_repos/

ちなみに, リポジトリの取得, マスターへの反映は

 - 取得 - 
 $ git clone ssh://[アカウント]@server/[git リポジトリの場所]
 - 更新の反映 -
 $ git push ssh://[アカウント]@server/[git リポジトリの場所]

git のコミットはローカルにしか反映されないので, マスターへの反映を適宜行なう必要あり.

Article テーブルの作成

bibtex の形式に変換するための情報として, Article には最低限

  • 論文タイトル
  • 著者(複数)
  • 雑誌名
  • 発行年
  • ボリューム
  • ページ(開始と終了)

が必要. 著者名はそのうち別のデータベースにするけど. とりあえず.

 $ ./script/generate scaffold Article \
  title:string \
  authors:string \
  journal:string \
  year:datetime \
  volume:integer \
  start_page:integer \
  end_page:integer
 ...

これで, 一通り足場(scaffold)ができる.
db/migrate/XXXXXXXX_create_articles.rb[XXXXX は日付による timestamp] によれば

 class CreateArticles < ActiveRecord::Migration
  def self.up
    create_table :articles do |t|
      t.string :title
      t.string :authors
      t.string :journal
      t.datetime :year
      t.integer :volume
      t.integer :start_page
      t.integer :end_page

      t.timestamps
    end
  end

  def self.down
    drop_table :articles
  end
end

となっている. データベースの作成は

 $ rake db:migrate

これで

 $ ./script/server 

として, ブラウザで http://localhost:3000/articles にアクセスしてみると一応それっぽい画面ができている.

で, この状態では [New Article] で情報が全く無い論文データが作成できてしまう.

なので, model の方に最低限の validation をかけておく. 少なくとも title, author(s), year は必須項目にしたい. app/models/articles.rb を弄る. 結果は以下.

class Article < ActiveRecord::Base
  validates_presence_of(:title, :authors, :year)
end

()をつけるのは, コーディングスタイルとしてはどうなんだろう. 個人的にはつけた方が好みなんだけど, ものの本ではつけてないなぁ...
これで, 空の文献データを作成しようとすると, ちゃんと怒られる.

次回

まだまだ始めたばっかなのでやることイッパイあるよー

  • test の修正, 追加
  • 作成時
    • year, (start|end)_page を integer で入力, チェック
    • year は Date オブジェクトを渡すようにする. 選択できるように.
  • 見栄えの修正その (1/n)
  • PDF のアップロードを可能にする.
    • 置き場のディレクトリは文献データから適宜決定する.
    • 文献データを更新した際は, PDF 置き場も変更する?
    • 存在しない文献データのディレクトリを適宜フラッシュする?

の予定.