ついに、ついにRailsアプリをDreamHostで動かすことに成功!
動いただけだけど、嬉しい。。
まあ喜んだのもつかの間、すぐエラーが出たんですがw
後、動作がとても重い。。チューニングしないとだめだなー。
とりあえずトラブったことをメモしておく。
環境はRails2.0.2, capistrano 2.5.0, Passenger(バージョン不明),Apache(たぶん2.2?)
1.サーバ名がわからない
deploy.rbに↓の設定をしなければならないんだけど、DreamHostのPanelを見てもサーバ名が載っていなくて困った。
set :domain yourserver.dreamhost.com # Dreamhost servername where your account is located
サーバ名はsshでサーバにログインすると最初に表示されます。
2.ドメイン名の設定が紛らわしい
Passengerを使う場合、DreamHostのPanelでドメインを
www.mySampleDomain.com/current/public
とするようにとSuppotWikiに書いてあったのでそうしたのだが、deploy.rbの↓の項目で迷った。
set :application, 'www.yourdomain.com' # Your app's location (domain or sub-domain name as setup in panel)
ここはwww.mySampleDomain.com/current/publicとすべきか、www.mySampleDomain.comとすべきか?
正解はwww.mySampleDomain.comのほう。
3.script/process/reaperに実行権限がないと怒られる
cap deployを実行するとreaperの実行権限がないよーと言われる。
実行権限を付加するには↓のコードをそれぞれのファイルに追加すればOK。
file:deploy.rb
set :chmod755, "app config db lib public vendor script script/* script/process/reaper public/disp*"
file:Capfile
namespace :deploy do task :restart, :roles => :app do run "cd #{current_path} && chmod 755 #{chmod755}" end end
4.サーバにgemをインストールできない(will_paginateを例にして説明します)
A.ローカルでgem unpack will_paginateを実行→{RAILS_ROOT}\vendor\plugins\にgemのフォルダができる
B.environment.rbのRails::Initializer.run do |config|ブロック内に↓のコードを書く
config.load_paths += %W( #{RAILS_ROOT}/vendor/plugins/mislav-will_paginate-2.3.3/lib )
C.environment.rbの末尾に↓のコードを追加
require 'will_paginate'
5.mysqlにアクセスできない
DB名を変えて作り直したら直りました。原因不明。。
6.デプロイ完了したけどwelcome Railsみたいなページが表示される
config/routes.rbの設定をしましょう。とりあえず↓のように設定をしておけばトップページは見られるかと。
map.root :controller => "login", :action => "login"
7.デプロイしてからhttp経由でsubversionのリポジトリにアクセスできない
おそらく6番でルーティング定義をしたからと思われる(未確認)ちゃんとルーティング定義を作ればいいんだろうけど、とりあえずサブドメインを作ってそっちにリポジトリを作ることで回避しました。あまり良い解決策じゃないだろうなあ。。
デプロイ以外にもひとつ。
番外:メソッド内でインスタンス変数のバリデーションを行う際にcreateかupdateかを判定する方法
Rails2.0.2にアップデートしてからどうもvalidates_〜系のヘルパがちゃんと動いてくれないのでバリデーションをすべてvalidateメソッド内で行っている。
新規作成時はチェックしたいけど更新時はチェックしたくないという場合、validatesヘルパでは:on => :createとすればよいがvalidateメソッド内で同じことをするにはどうすればいいか?
俺はとりあえずnew_recordフィールドが存在するかどうかで確認しました。
self.instance_variables.index("new_record")