production環境で使ってみる。

Ajax住所録を見て、こんな風にwebアプリケーションを直接試すことができると、分かり易くていい!どのように動作するのか、一目瞭然だ。そういうわけで、表現力の乏しい日記を少しでも補うために、自分でもsoftwarebookも運用してみたくなった。

運用環境

Railsにはwebアプリケーションの運用環境が3つある。config/database.ymlを見ると、development(開発用)、test(テスト用)、production(本稼働用)に設定が分かれている。その3つの環境だ。

  • development(開発用)環境では、appフォルダ以下のコードを変更すると、サーバーの稼働中であっても、コードの変更が即座に反映される。サーバーを再起動する必要がないので、動作確認がすぐ出来てストレスが無い。開発環境としてはとても良い。しかし、その分レスポンスが悪くなっている。
  • test(テスト用)環境は、まだ使ったことはないが、コードのテストをするための環境。
  • production(本稼働用)環境では、サーバーを再起動しないとコードの変更は反映されないが、レスポンスは良くなるらしい。Rails本来の性能が出る。

今まではdevelopment環境でsoftwarebookを起動して動作確認をしていた。softwarebookは自分がRailsを勉強するためのプロジェクトなので、このままのdevelopment環境で問題ないのだが、せっかくなのでproduction環境を使って運用してみる。

config/database.ymlの設定

今まで、developmentしか設定していなかったので、test、productionについてもちゃんと設定してみた。

development:
  adapter: mysql
  database: softwarebook2_development
  username: root
  password: '0123'
  host: localhost

test:
  adapter: mysql
  database: softwarebook2_test
  username: root
  password: '0123'
  host: localhost

production:
  adapter: mysql
  database: softwarebook2_development
  username: root
  password: '0123'
  host: localhost

設定が同じ箇所は一つにまとめて、このように書くことも出来るようだ。(typoのconfig/database.ymlを参考にしました)

login: &login
  adapter: mysql
  username: root
  password: '0123'
  host: localhost

development:
  database: softwarebook2_development
  <<: *login

test:
  database: softwarebook2_test
  <<: *login

production:
  database: softwarebook2_development
  <<: *login

config/environments/production.rbの設定

development、test、productionという性質の違いは、config/environments以下の環境名ファイルの設定によって決定されているようだ。ここでは、production環境用の設定を行う。login_engineのメール送信の設定をdevelopment.rbからコピーして、最終行に追記した。

...(途中省略)...
ActionMailer::Base.server_settings = {
  :address => "smtp.mac.com",
  :port => 25,
  :domain => "smtp.mac.com",
  :user_name => ".macのユーザー名(メールアドレス@の手前まで)",
  :password => ".macのパスワード",
  :authentication => :login
}

データベースの設定

production用のデータベースを新規作成した。
  • CocoaMySQLで、左上のデータベースの枠内で、緑色のプラスボタンのアイコンを押す。データベース名はsoftwarebook2_productionと入力した。
RadRails「Rake タスク」タブで、以下の手順でデータベース環境を整える。
  • プルダウンリストでdb:migrateを選択*1して、実行ボタンを押す。(softwarebook2のマイグレーションを行う。)
  • プルダウンリストでdb:migrate:enginesを選択して、実行ボタンを押す。(login_engine、user_engineのenginesプラグイン系のマイグレーションを一気に行う。)
  • プルダウンリストでbootstrapを選択して、実行ボタンを押す。(user_engineのroleテーブル、permissionテーブル、adminユーザーの初期設定を行う。)

production環境でサーバーを起動

  • RadRailsの「サーバー」タブで、プロジェクトのサーバーを選択する。(起動中であれば、一旦停止する。)
  • 「サーバー」タブのウィンドウ右上の書類アイコンをクリックして、編集ウィンドウを表示する。

  • 環境をproductionに変更して、OKボタンを押す。
  • いつものように起動すれば、production環境でサーバーが起動する。

エラーの発生と対策

早速ログインして、User権限のアクセス権にsoftwaresコントローラーのアクションを追加しようと思ったが、ここで問題発生。

http://0.0.0.0:3000/role/list

上記URLにアクセスすると、下記のエラーNoMethodError in Role#listが発生してしまう。

  • http://0.0.0.0:3000/user/listや、http://0.0.0.0:3000/permission/listには問題なくアクセスできる。
  • development環境に戻すと、正常に表示される。
  • 環境の違いが原因と思い、config/environments/production.rbをdevelopment.rbと比較してみる。
  • どうやら「config.cache_classes = true」を、falseに変更すれば正常に動くようだ。しかし、development.rbのコメントの説明を読んでみると、この設定がfalseになっていると、毎回のリクエストごとにアプリケーションコードのリロードを行い(サーバーを再起動しなくてもコードの変更が反映される)、それによってレスポンスが悪くなるという内容が書かれている。falseに変更してしまっては、production環境の意味がなくなってしまう。
  • エラーの内容をよく読んでみると...
undefined method `human_attribute_name' for nil:NilClass

クラスが存在しないために、human_attribute_nameメソッドも定義されていないことになっている?(こんな意味なのだろうか?うまく訳せない...。)

  • human_attribute_nameメソッドは、vendor/plugins/user_engine/app/views/role/list.rhtmlの6行目、<%= column.human_name %>を実行する時に呼び出されている。
  • human_nameをRailsAPIドキュメントで確認すると、ActiveRecord::ConnectionAdapters::Columnというクラスのインスタンスメソッドになっている。
  • このメソッドを利用可能にするためにはどうすれば良いのか悩み、vendor/plugins/user_engine/app/models/role.rbにオレンジ色の1行を追記してみた。
class Role < ActiveRecord::Base
  include ActiveRecord::ConnectionAdapters::Column
  has_and_belongs_to_many :users, :class_name => "User", :join_table => UserEngine.config(:user_role_table)
  has_and_belongs_to_many :permissions, :join_table => UserEngine.config(:permission_role_table)
...(以下省略)...
  • これでhttp://0.0.0.0:3000/role/listにもアクセスできるようになった。が...しかし、今度はrole/showとrole/editで「Application error (Rails)」が出てしまう。やっぱりダメか...。
  • 少々このエラーで立ち止まり過ぎた。(すでに2日経過)とりあえず、config/environments/production.rbを「config.cache_classes = false」に設定して、次に進むことにした。(これじゃproduction環境の意味がない、後日なんとしても解決したい!)
      • なぜ、development環境では正常に動くのか?
      • なぜ、userとpermissionのcolumn.human_nameは正常に動いて、roleでは動かないのか?
      • 疑問は残った...。動きを正しく理解したい...。

テストデータを作成

データベースの中身が空っぽでは、データを登録するところから始めなくてはならないので、あらかじめテストデータを作っておく。テストデータをデータベースに簡単にセットする仕組みがRailsには用意されている。test/fixturesフォルダに「テーブル名(複数形).yml」のファイルを用意しておく。

test/fixtures/keywords.yml
# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
keyword1:
  id: 1
  name: Ruby on Rails
keyword2:
  id: 2
  name: webブラウザ
keyword3:
  id: 3
  name: 画像管理
test/fixtures/softwares.yml
# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
software1:
  id: 1
  title: Ruby
  description: 日本人が開発したオブジェクト指向スクリプト言語。
  url: http://www.ruby-lang.org/ja/
  created_on: 2006-12-24 17:44:17
  updated_on: 2006-12-24 17:44:17
  keyword_id: 1
  user_id: 1
software2:
  id: 2
  title: Rails
  description: Rubyによるwebアプリケーション開発フレームワーク。
  url: http://www.rubyonrails.org/
  created_on: 2006-12-24 17:57:39
  updated_on: 2006-12-24 17:57:39
  keyword_id: 1
  user_id: 1
software3:
  id: 3
  title: Safari
  description: アップル標準webブラウザ
  url: http://www.apple.com/jp/safari/
  created_on: 2006-12-24 18:01:14
  updated_on: 2006-12-24 18:01:14
  keyword_id: 2
  user_id: 1
software4:
  id: 4
  title: Locomotive
  description: ダウンロードして解凍するだけでRuby on Rails開発環境が整う。(MacOSX専用)
  url: http://locomotive.raaum.org/
  created_on: 2006-12-24 18:02:30
  updated_on: 2006-12-24 18:02:30
  keyword_id: 1
  user_id: 1
software5:
  id: 5
  title: iPhoto
  description: 写真や映像の管理ソフト。ちょっとした補正も可能。
  url: http://www.apple.com/jp/ilife/iphoto/
  created_on: 2006-12-24 18:56:03
  updated_on: 2006-12-24 18:56:03
  keyword_id: 3
  user_id: 1
software6:
  id: 6
  title: Firefox
  description: オープンソースの高機能なブラウザ。
  url: http://www.mozilla-japan.org/
  created_on: 2006-12-24 18:59:23
  updated_on: 2006-12-24 18:59:23
  keyword_id: 2
  user_id: 1
  • RadRailsの「Rake タスク」タブで、プルダウンリストからdb:fixtures:loadを選択する。(項目に無ければ、直接キー入力する。)
  • 右側のテキストフィールドにRAILS_ENV=productionを入力して、実行ボタンを押す。
  • softwaresbook2_productionデータベースのテーブルが.ymlファイルの内容でリセットされる。


以上で設定は完了。

softwarebookの使い方

(現在稼働中)

  • 何が出来る?
    • Ruby-GetText-Packageで日本語化したLoginEngineとUserEngineの動きを確認できる。
    • Railsの勉強のために作っているSoftwarebookの現在の状態を確認できる。
  • 上記で、Admin権限でログインできる。全権限を持っているので、全ての機能を試すことが可能。ただし、自分自身を削除したり、roleやpermissionを無意味に削除や変更すると、エラーが発生するかもしれない...。
  • 新規アカウント登録を試すなら...
    • 登録したメールアドレスに認証メールが送信される。
    • そのメールから認証手続きをして、やっとアカウント登録が完了する。
    • メール認証するまではログインすることは出来ない。
  • データベースは、気が向いた時に初期化します。
  • 不定期に繋がらないことがあるかもしれません。

*1:もし、選択項目に存在しなければ直接キー入力する。実は最近、この選択項目が一つも表示されなくなってしまい、とても困っていた。原因は分からない...。しかし、今はまた選択項目が表示されるようになっている。何がきっかけで、また表示されるようになったのか?謎だ...。