ラベル Rails の投稿を表示しています。 すべての投稿を表示
ラベル Rails の投稿を表示しています。 すべての投稿を表示

2011年5月14日土曜日

herokuを使ってみる(覚書)

herokuとgit 初トライです。

Mackportsのアップデート
$ sudo port -d selfupdate

gitのインストール(Macの場合です)

$ sudo port install git-core

バージョン確認
$ git --version

Railsアプリのディレクトリに移動
$ cd

$ git init
カレントディレクトリに .git ディレクトリが作成される

ソースをコミット
$ git add .
$ git commit -am "first commit"

herokuのサイトでサインアップ
届いたメールでアクティベーション実施

heroku のインストール
$ sudo gem install heroku

heroku 上にアプリ作成
$ heroku create
※ちなみにアプリケーション名にアンダーバー _ は使えないようです

既に秘密鍵を持っていれば
$ heroku keys:add
で鍵を登録

なければ事前に
$ ssh-keygen -t ras
を実行しておく

git に remote を登録
$ git remote add heroku git@heroku.com:.git

これで、次のコマンドで heroku に push できるようになるはず

$ git push heroku masuter

$ heroku db:migrate
$ heroku open

本家のここを見ればほぼ分かると思います
http://devcenter.heroku.com/articles/quickstart

以上

2011年4月10日日曜日

Railsで簡易予約システムを考える

3.11の後、しばらく更新していませんでしたが、久々にメモがわりに書いています。

Railsで簡易予約システムを考えてみます。

エンティティ

• リソース系
予約対象:item

予約対象グループ:item_group
仕様:specification
仕様カテゴリ:spec_category

予約状況:booking_status

• イベント系

予約:booking

その他、基本的なユーザ、カレンダー、料金が発生する場合は、利用料などを管理するマスタ(対照表)、承認が必要なら・・・など、考えれば考えるほど出てきてしまうのですが、簡易予約システムという(言い訳)ことで・・・とりあえずここ辺からスタート。

リソース系(マスタ)が多いので、すべてscaffoldで一旦作成します。

その前にアプリケーション名はbookingとしてみます。

プロジェクトの作成

$ rails --database=postgresql booking

データベースの作成
今回、PostgreSQLを利用しています。

database.yml のユーザ、パスワード等を指定し、

$ rake db:create

を実行します。

続いてscaffoldでひと通りジェネレート
$ ruby script/generate scaffold item name:string item_group_id:integer spec_id01:integer spec_id02:integer description:text deleted:boolean ins_user:string upd_user:string
$ ruby script/generate scaffold  item_group name:string spec_category_id01:integer spec_category_id02:integer description:text deleted:boolean ins_user:string upd_user:string
$ ruby script/generate scaffold specification name:string spec_category_id:integer deleted:boolean ins_user:string upd_user:string
$ ruby script/generate scaffold spec_category name:string description:text deleted:boolean ins_user:string upd_user:string
$ ruby script/generate scaffold booking_status name:string deleted:boolean ins_user:string upd_user:string
$ ruby script/generate scaffold booking user:string item_id:integer start_date:date end_date:date status:integer comment:text

デフォルトで作成されたModelにデータの関連を追加します。
主な関連は次のとおり

item [n] - [1]item_group
item_group[n] - [1]spec_category
spec_category[1] - [n]specification
item[n]-[1]specification

itemには仕様(specification)を2つまで指定でき、仕様の種類は、itemのグループによって決めたいと思います。そのため、
item[n]-[1]specification
としていても、条件で絞りこまなければならないのですが、そのへんは後で考えたいと思います。

続いて、使い勝手を少し改善しましょう。
画面にIDがそのまま出てしまうのは、人間が操作するのに厳しいので、名称が出るようにMode、View、Controllerを修正します。

Modelには、has_manyや、belongs_toを指定します。
また、itemのように1つのモデルに2つまで関連する項目を指定するときは、belongs_to にアソシエーション名をつけ、:class_name、:foreign_keyのオプションを指定します。
Viewはテキストフィールド(f.text_field)の箇所を、プルダウン(f.select)に変更します。

Model


class Item < ActiveRecord::Base
  
belongs_to :item_group
  
belongs_to :specification01,
  
  :class_name => 'Specification',
    
:foreign_key => 'spec_id01'
  ・・・

View
<=% f.select(:item_group_id, ItemGroupsController.item_group_list) %>

Controllerに追加するクラスメソッド(self. が付きます)
def self.item_group_list
    ItemGroup.find(:all).map do |item_group|
      [item_group.name, item_group.id]
    end
  end

item の一覧画面と、登録画面は次のような感じでできました。




次は予約画面の作成を行って見ます。

2011年1月27日木曜日

NetBeansでのRakeタスク db:create 実行について

NetBeansではどうもRakeタスクのdb:createがうまくいかないようですね。
私の環境は今回、WindowsXP、MySQL5、NetBeans6.9.1、Rails2.3.8、アダプタはjdbcmysqlを使用していました。

NetBeans上で実行して、コンソールにはエラーが出ませんがデータベースは作成されていません。
以前書いたRails:簡易辞書システムを作成しよう2ではMac環境でのコマンドラインでの実行方法を記載していますが、このあたりは色々と問題があるのかも知れません。
やはりRailsはIDEよりコマンドラインで!・・・ということでしょうか。

結局データベースは
>create database <db_name> default character set utf8;
と、コマンドで作成することになりました。

2011年1月20日木曜日

Rails:簡易辞書システムを作成しよう2

今回想定しているエンティティは
  • ドメイン
  • 辞書
2つです。
辞書の名称(論理名)と物理名にはとりあえず一意制約を付けておきます。
class Dictionary < ActiveRecord::Base
  validates_uniqueness_of :logical_name
  validates_uniqueness_of :physical_name
end


次に、1つのドメインに対し、辞書の項目が複数対応する一対多の関係を持ちますので、その関連をModelに設定します。

#辞書
class Dictionary < ActiveRecord::Base
  belongs_to :domain
  
  validates_uniqueness_of :logical_name
  validates_uniqueness_of :physical_name
end

#ドメイン
class Domain < ActiveRecord::Base
  has_many :dictionaries
end
辞書にはドメイン1つが設定されます。
また、ドメインは複数の辞書項目が対応します。

 belongs_to :domain

のシンボル:domainは単数形ですが、

 has_many :dictionaries

の辞書は複数レコードとなるため、複数形のシンボル:dictionariesを指定します。

続いてViewを修正します。・・・がここでハマってしまいました。
WebでRailsのドキュメントhttp://api.rubyonrails.org/を参照していたのですが、Rails 3.0.3(当時)だったのです。
collection_selectメソッドの引数がどうもRails 2.3.xと異なっているようですね。

ドキュメントを見ながらnew.html.erb修正すると、以下のような感じ・・・

<p>
    <%= f.label :domain_id %><br />
    <%= collection_select(:dictionary, :domain_id, Domain.all, :id, :domain_name, :prompt => true) %>
  </p>


サーバログを見ると、プルダウンから値が取得できていない・・・。登録処理でNULLがインサートされてしまいました。

[4;36;1mSQL (0.0ms) [0m    [0;1mINSERT INTO `dictionaries` (`logical_name`, `physical_name`, `domain_id`, `data_type`, `data_digit`, `remark`, `created_at`, `updated_at`) VALUES('aaa', 'a', NULL, 'string', '', 'aaa', '2011-01-20 11:40:10', '2011-01-20 11:40:10') [0m

次に
f.collection_select(.....

に修正したら今度は

undefined method `merge' for :domain_name:Symbol

しばらく考え、Railsレシピブックを見直したところ、出ていました。引数が違う・・・
実は第1引数の :dictionary が不要でした。

<p>
    <%= f.label :domain_id %><br />
    <%= f.collection_select(:domain_id, Domain.all, :id, :domain_name, :prompt => true) %>

が正解だったようです。

テーブルの正規化など、他のテーブル(Model)の値をプルダウンで表示させたいことは多々あると思います。
頻繁に利用する機会も出てくるでしょう。

2011年1月16日日曜日

Rails:簡易辞書システムを作成しよう

システム開発において、やはりデータ設計がしっかりできていないと、後々仕様変更などで苦労するものです。また、技術者の異動や、ユーザ(お客様)も人事異動により業務やシステムを知らない人がシステムのユーザになることも頻繁にあると思います。

データ中心アプローチ(DOA)の専門家ではありませんので、それは専門の書籍などで理解していただきたいと思いますが、やはりユーザと技術者とで認識のズレ(齟齬)がないように辞書があったほうが良いですね。

開発工程が進むにつれて、技術者も増えるので、情報共有という点でもはやり辞書(データのリファレンス的な物)は必要ですね。

気が向いたので、JRuby on Railsの環境で構築することにしました。

まずはJRubyをダウンロード。環境はWindows XP。(この環境はいずれ変えてしまうかも知れません)

http://jruby.org/download からJRuby1.5.6をダウンロードしました。Rubyの1.8.7相当になります。(>JRuby  -v で確認)
JRuby1.6.0.RC1もリリースされているようですが、Ruby1.8.7相当の方でとりあえず十分だと思うのでまずはこのバージョンを選択。

またWindows環境なので、JRuby 1.5.6 Windows Executable (md5, sha1) をダウンロード。
exe形式の実行ファイルなので、インストールすると、Pathにインストール先のbinディレクトリ(Windowsの場合フォルダと言いますが、ディレクトリという文言を使用させてもらいます)が追加されます。

次に Rails をインストール。バージョンを指定しないと Rails 3.0 以上がインストールされてしまうようで、2.3.xを指定します。
今回はバージョン2.3.xで現時点で最新の 2.3.8 を指定しました。

NetBeansもインストールされている環境なので、NetBeans上でRailsの開発もできるのですが、今回敢えてコマンドラインから環境を作ることにしました。

>gem install rails --version 2.3.8
JRuby limited openssl loaded. http://jruby.org/openssl
gem install jruby-openssl for full support.
Successfully installed activesupport-2.3.8
Successfully installed activerecord-2.3.8
Successfully installed rack-1.1.0
Successfully installed actionpack-2.3.8
Successfully installed actionmailer-2.3.8
Successfully installed activeresource-2.3.8
Successfully installed rails-2.3.8
7 gems installed
Installing ri documentation for activesupport-2.3.8...
Installing ri documentation for activerecord-2.3.8...
Installing ri documentation for rack-1.1.0...
Installing ri documentation for actionpack-2.3.8...
Installing ri documentation for actionmailer-2.3.8...
Installing ri documentation for activeresource-2.3.8...
Installing ri documentation for rails-2.3.8...
Installing RDoc documentation for activesupport-2.3.8...
Installing RDoc documentation for activerecord-2.3.8...
Installing RDoc documentation for rack-1.1.0...
Installing RDoc documentation for actionpack-2.3.8...
Installing RDoc documentation for actionmailer-2.3.8...
Installing RDoc documentation for activeresource-2.3.8...
Installing RDoc documentation for rails-2.3.8...

続いてデータベースはMySQLを使用するので、アダプタをインストールします。

>gem install activerecord-jdbcmysql-adapter
JRuby limited openssl loaded. http://jruby.org/openssl
gem install jruby-openssl for full support.
Successfully installed activerecord-jdbc-adapter-1.1.1
Successfully installed jdbc-mysql-5.1.13
Successfully installed activerecord-jdbcmysql-adapter-1.1.1
3 gems installed
Installing ri documentation for activerecord-jdbc-adapter-1.1.1...

いよいよプロジェクトを作成します。
今回プロジェクト名はnew_windとしました。データベースはデフォルトだとSQLiteが指定されるようなので、mysqlを指定します。
でも、作成されるconfig/database.ymlのadapterにmysqlと指定されてしますので、これを生成後にjdbcmysqlに変更する必要があります。

>rails new_wind --database=mysql
      exists
      create  app/controllers
      create  app/helpers
      create  app/models
      create  app/views/layouts
      create  config/environments
      create  config/initializers
      create  config/locales
      create  db
      create  doc
      create  lib
      create  lib/tasks
      exists  log
      create  public/images
      create  public/javascripts
      create  public/stylesheets
      create  script/performance
      create  test/fixtures
      create  test/functional
      create  test/integration
      create  test/performance
      create  test/unit
      create  vendor
      create  vendor/plugins
     途中省略
      create  log/development.log
      create  log/test.log

プロジェクトが作成できたら、カレントディレクトリをプロジェクトに移動します。
>cd new_wind

続いてデータベース作成です。
JRubyではなく、Rubyであれば >rake db:create で良いのですが、JRubyの場合、
>jruby -S db:create のように作成するようです。
ですが、このコマンドでデータベースを作成した場合、エンコーディングがutf8にならないようなので、mysqlのコマンドで作成しました。

mysql> create database new_wind_development default character set utf8;

あまり真面目に考えていないので、まず作成するテーブルは”ドメイン”と”辞書”の二つ。
ドメインはその項目が紐づく業務をしていします。例えば、販売管理、会計など。
辞書は項目、つまりデータです。名称(論理名)と、物理名、型、桁数、説明(備考)、ドメイン等を登録したいと思います。

では早速scaffoldで作成。(以下は辞書のテーブルの足場(scaffold)を作成)

>jruby -S script/generate scaffold dictionary logical_name:string physical_name:string dom
ain_id:integer data_type:string data_digit:string remark:text
JRuby limited openssl loaded. http://jruby.org/openssl
gem install jruby-openssl for full support.
      exists  app/models/
      exists  app/controllers/
      exists  app/helpers/
      create  app/views/dictionaries
      exists  app/views/layouts/
      exists  test/functional/
      exists  test/unit/
      exists  test/unit/helpers/
      create  public/stylesheets/
      create  app/views/dictionaries/index.html.erb
      create  app/views/dictionaries/show.html.erb
      create  app/views/dictionaries/new.html.erb
      create  app/views/dictionaries/edit.html.erb
      create  app/views/layouts/dictionaries.html.erb
      create  public/stylesheets/scaffold.css
      create  app/controllers/dictionaries_controller.rb
      create  test/functional/dictionaries_controller_test.rb
      create  app/helpers/dictionaries_helper.rb
      create  test/unit/helpers/dictionaries_helper_test.rb
       route  map.resources :dictionaries
  dependency  model
      exists    app/models/
      exists    test/unit/
      exists    test/fixtures/
      create    app/models/dictionary.rb
      create    test/unit/dictionary_test.rb
      create    test/fixtures/dictionaries.yml
      exists    db/migrate
      create    db/migrate/20110115075258_create_dictionaries.rb

続いてテーブルの作成。

>jruby -S rake db:migrate
(in C:/Documents and Settings/t0079/My Documents/NetBeansProjects/new_wind)
rake aborted!
The driver encountered an unknown error: com.mysql.jdbc.exceptions.jdbc4.MySQLSy
ntaxErrorException: Unknown database 'new_wind_development'

ここで、database.ymlのadapterにjdbcmysqlを指定したのに、jdbcドライバな無いと怒られてしまいました。
(実はデータベースも名前を間違えて作成してしまったので、その点も指摘されたメッセージが表示されています)

lib/jarディレクトリの下にJDBCドライバを配置しなければなりません。
jarディレクトリは存在しないと思いますので、jarディレクトリを作成し、その中にMySQLのドライバの含まれたjarファイルを置いてください。
気をとりなおして再度テーブルを作成。

>jruby -S rake db:migrate
(in C:/Documents and Settings/t0079/My Documents/NetBeansProjects/new_wind)
==  CreateDictionaries: migrating =============================================
-- create_table(:dictionaries)
   -> 0.0310s
   -> 0 rows
==  CreateDictionaries: migrated (0.0310s) ====================================

今度は成功。

続いてテスト用初期データ登録のためのmigrationを作成します。

>jruby -S
script/generate migration add_dictionary_data
JRuby limited openssl loaded. http://jruby.org/openssl
gem install jruby-openssl for full support.
      exists  db/migrate
      create  db/migrate/20110115075505_add_dictionary_data.rb

TODO:あとで、ここにテストデータのdb/migrate/20110115075505_add_dictionary_data.rbファイルの内容を追加します。

データ登録はmigrateの実行で行います。

>jruby -S
rake db:migrate
(in C:/Documents and Settings/t0079/My Documents/NetBeansProjects/new_wind)
==  AddDictionaryData: migrating ==============================================
==  AddDictionaryData: migrated (0.2970s) =====================================

これで、データが登録されました。
次は、ドメインを選択(プルダウン)で指定できるようにしましょう。

2011年1月13日木曜日

Rails:Ruby on Railsを始めよう

Railsの生産性は高いことは認めているのですが、Railsの哲学であるConvention over Configuration(設定より規約)の規約を多く覚えなければならない点がRails習得の壁でしょうか。

昔Javaのオブジェクト指向を理解するまでに時間がかかったことを思い出します。今となっては不思議なくらい苦しんでいましたが・・・。

Railsもなかなか苦労しています。絶対的にプログラミングに携わる時間も少なくなっているので・・・。

それでも A journey of a thousand miles begins with a single step 千里の道も一歩からですね。

Railsの入門(インストールなど)は他のサイトに任せて、実際にRuby on Railsでアプリケーションを作成する際のポイントを覚書として、綴っていこうと思います。

  • バリデーションはmodelに書く

Productモデルにtitle,description,image_urlは必須入力を指定します。

validates_presence_of
は宣言と呼ばれますが、実はメソッド。

class Product < ActiveRecord::Base
 validates_presence_of :title, :description, :image_url
end
上記設定で、入力しなければならない項目を、未入力のまま登録しようとすると下のようなエラーが表示されます。


  • テストデータはmigrationで。
モデルproductのテストデータを作成します。Productsテーブルには名称、説明、画像URL、価格の4つの項目があるとします。
まず、
> ruby script/generate migration add_test_data

   exists  db/migrate
   create  db/migrate/20110113140008_add_test_data.rb

続いてdb/migrate/20110113140008_add_test_data.rb を編集します。

self.upメソッドに登録するデータを、self.downに登録したデータを戻す処理を記載します。
この場合upメソッドで一度Productテーブルのデータを削除してから、テストデータを登録しています。


class AddTestData < ActiveRecord::Migration
  def self.up
    Product.delete_all
    Product.create(:title => 'Cycoron', 
                    :description =>
                    %{<p>Wooden dice with bell.</p>},
                    :image_url =>'/image/Cycoron.jpg',
                    :price => 28.5)
                    
    Product.create(:title => 'Moguzilla',
                    :description =>
                    %{<p>Wooden pen stand.
                      It looks like a whale.</p>},
                    :image_url => '/image/Moguzilla.jpg',
                    :price => 168.0)
  end

  def self.down
    Product.delete_all
  end
end

データを削除する場合、マイグレーションのバージョンを指定しますので、
> rake db:migrate:down VERSION=20110113140008
を実行すれば、テストデータが削除されます。
また、データベースを最新の状態に戻すには
> rake db:migrate
を実行すればOK。

試したコンソールは次のような感じです。(削除も試し、再度マイグレーションを実行)

*****-no-MacBook-Pro:depot *****$ rake db:migrate:down VERSION=20110113140008
(in /Users/*****/NetBeansProjects/depot)
==  AddTestData: reverting ====================================================
==  AddTestData: reverted (0.0037s) ===========================================

*****-no-MacBook-Pro:depot *****$ rake db:migrate(in /Users/*****/NetBeansProjects/depot)
==  AddTestData: migrating ====================================================
==  AddTestData: migrated (0.0217s) ===========================================

一覧画面