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と入力した。
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をRailsのAPIドキュメントで確認すると、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ファイルの内容でリセットされる。
-
- db:fixtures:loadを実行すると、keywords、softwaresテーブルのそれまでの内容はすべて破棄される。
- users、roles、permissionsテーブルの内容は.ymlで指定してないので現状のデータが維持される。
- YAMLについての参考ページ:Rubyist Magazine - プログラマーのための YAML 入門 (初級編)
-
以上で設定は完了。
softwarebookの使い方
(現在稼働中)
- 何が出来る?
- softwarebookのページ
- ログイン名:zarigani
- パスワード:zarigani
- 上記で、Admin権限でログインできる。全権限を持っているので、全ての機能を試すことが可能。ただし、自分自身を削除したり、roleやpermissionを無意味に削除や変更すると、エラーが発生するかもしれない...。
- 新規アカウント登録を試すなら...
- 登録したメールアドレスに認証メールが送信される。
- そのメールから認証手続きをして、やっとアカウント登録が完了する。
- メール認証するまではログインすることは出来ない。
- データベースは、気が向いた時に初期化します。
- 不定期に繋がらないことがあるかもしれません。
*1:もし、選択項目に存在しなければ直接キー入力する。実は最近、この選択項目が一つも表示されなくなってしまい、とても困っていた。原因は分からない...。しかし、今はまた選択項目が表示されるようになっている。何がきっかけで、また表示されるようになったのか?謎だ...。