ログ日記

作業ログと日記とメモ

参考: 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

などを実行して動きを確かめる。

Rails

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動作確認完了。