■
参考: http://gihyo.jp/dev/serial/01/heroku/0002
まずは http://heroku.com/ でアカウントを作る。
gem install heroku heroku list
Email、Passwordを入力するとsshの公開鍵を聞かれるので番号を選択する。
自動で公開鍵がアップされるようだ。
rails new demo の続きから。
git init git add . git commit heroku create git push heroku master heroku open
アップされたようだ。超簡単。
herokuのPostgreSQLを使う設定は
heroku addons:add heroku-postgresql
だが、色々試しているうちに複数できてしまった。
heroku config
で確認できる。
マニュアル
heroku addons:add heroku-postgresql
heroku pg:info heroku pg:promote heroku pg:psql
などを実行して動きを確かめる。
When Rails applications are deployed to Heroku a database.yml file is automatically generated for your application that configures ActiveRecord to use a PostgreSQL connection and to connect to the database located at DATABASE_URL.
https://devcenter.heroku.com/articles/heroku-postgresql
どうもdatabase.ymlは自動生成されるようなので、config/database.yml はローカルの情報を書けばいいみたい。
とりあえずPostgreSQLの準備をしてDBを変更する。
# su postgres $ createuser rails -P $ createdb rails_demo -O rails
Gemfileのsqlite3をpgに書き換えて
% bundle install
config/database.yml の編集
development: adapter: postgresql database: rails_demo host: localhost username: rails password: xxxx
テーブルを作って練習。
% rails g scaffold Item title:string body:string invoke active_record /home/nishimura/.rvm/gems/ruby-1.9.3-p385/gems/activesupport-3.2.12/lib/active_support/dependencies.rb:251:in `require': Please install the postgres adapter: `gem install activerecord-postgres-adapter` (cannot load such file -- active_record/connection_adapters/postgres_adapter) (LoadError)
アダプターが無いとエラーが出た。
色々検索したり設定したりして、database.yml設定のadapter の値が activerecord-[ここ]-adapter に入ることが分かった。
postgresqlじゃなくてpostgresと書いてしまっていた…。postgresというものもあったけれど、それがpgになったらしい。どこか古い情報を参照してたみたい。
気を取り直してもう一度。
% rails g scaffold Item title:string body:string % rake db:migrate % rm public/index.html
config/routes.rb に追記
root :to => "items#index"
確認する。
% rails server
画面で見てみると、ちょっと想定と違う。psqlで確認してみると…型を間違えた。
とりあえず git commit してから作業。
scaffoldをやり直してもいいけども、せっかくなのでmigrationで。
% rails g migration ChangeColumnBodyInItems % vi db/migrate/20130221111819_change_column_body_in_items.rb
class ChangeColumnBodyInItems < ActiveRecord::Migration def up change_column :items, :body, :text change_column :items, :title, :text end def down change_column :items, :body, :string change_column :items, :body, :string end end
% rake db:migrate
最初からscaffoldでtextを作ったときの表示も参考にしたいので新しいテーブルを作る。
% rails g scaffold ItemChild body:text item:references % rake db:migrate
psqlで確認すると item_childrenテーブルが出来ている。参照用のIDはあるが、外部キー制約は付かないようだ。
とりあえず localhost:3000/item_children で確認してテーブル追加は終了。
これは…開発速度が上がるのか?
SELECT でレコードが存在しなかったので INSERT しようとしたら、その間に他のクライアントから登録されてしまって重複エラーになりました。
なお、このエラーはバリデーションのチェックにはならず、そのままアプリがエラーになってしまいます。エラーにせず、一意性のバリデーションのチェックに引っかかったのと同じようにする方法はどうやらないみたいです。ほとんど発生しないから考えないって感じでしょうか。
Rails でユニーク制約 - @tmtms のメモ
そもそもRailsは初期設定がSQLiteを使っているしDB側の制約に頼らない感じなのかな。
DB側できっちり作ってアプリ側ではゆるくして、制約に引っかかったら例外をキャッチしてエラーメッセージを自動で表示するのが最近の自分の中での流行りなのだが。
最近Rails始めたと書いてあったのでさかのぼって読んでいったら、結構ハマりどころあるみたいね…。
まあいいか。とりあえずコミットしてアップする。
git add . git commit -a -m "db test" git push heroku master heroku open
We're sorry, but something went wrong. と言われた。
heroku run rake db:migrate
rake db:migrate @ heroku - かいはつにっき
とか http://d.hatena.ne.jp/piggery/20120807 とか。
とりあえず production とかは関係なさそうなのでローカルもherokuも development のままやってる。
これでHerokuでのPostgreSQL動作確認完了。