« はじめようRuby on Rails(初版)をRails2.xでやってみる STEP-1(4章) | トップページ | モバイルスイカで新幹線 CM »

2008年2月26日 (火)

はじめようRuby on Rails(初版)をRails2.xでやってみる STEP-2(5章)

1. Databaseの中にTableを作成

> ruby script/generate  migration create_schedules
> vi [RAILSROOT]/db/migrate/001_create_schedules.rb
class CreateSchedules < ActiveRecord::Migration
  def self.up
    create_table(:schedules) do | table|
      table.column(:datetime, :timestamp)
      table.column(:title, :string)
      table.column(:content, :text)
    end
  end

  def self.down
    drop_table(:schedules)
  end
end

> rake db:migrate

> mysql scheduler_development -u rails -p
mysql> show tables;
+------------------------------------+
| Tables_in_scheduler_r2_development |
+------------------------------------+
| schedules                          |
| schema_info                        |
+------------------------------------+
2 rows in set (0.01 sec)

どうなったのかは、[RAILSROOT]/log/development.logを確認。

2. scaffold(Contoroler, View, Model雛形作成)
(Rails2.xから、scaffolding pluginとして分離されたという情報があったが、私の環境では何もいれなくても使えてしまった。)

Model名を指定(1文字目は大文字、Modelの元になるDB Tableの単数形)。

> ruby script/generate scaffold Schedule



Another migration is already named create_schedules: db/migrate/001_create_schedules.rb

さっそく、エラー…。
調べてみると、Rails2.xからは、migrationファイルが先に存在すると、scaffoldに失敗するようです。
"--skip-migration"オプションをつければ、scaffoldが最後まで行きます。

ex).
> ruby script/generate scaffold Schedule --skip-migration

3. Test

> rake

特に問題なし。

4. 動かしてみる

WEBrickを立ち上げて
http://localhost:3000/schedules/listにブラウザでアクセス。

今度は、
ActiveRecord::RecordNotFound in SchedulesController#show
って、エラーが…。

scaffoldが出すログをきちんと見てれば、わかりきったことなんですが、listはありません。
また、標準でアクセスされるのが、listではなく、indexに変わってます。

http://localhost:3000/schedules/にアクセスすると、本に近いものが出てきます。
この辺りも微妙な差異が…

しかも、Newをクリックしてもフィールドが何もありません。
rails1.xまでは、Tableの全てのフィールドがViewに含まれていたのが、rails2.xからは明示的に指定しないと反映されません。
後から、いじるので無駄ということでしょうか?
本と同じ感じにするには。

> ruby script/generate scaffold Schedule datetime:timestamp title:string content:text --skip-migration

これは、多分、migrationファイルをいじらなくても、

> ruby script/generate scaffold Schedule datetime:timestamp title:string content:text

みたいにやれば、migrationファイルも自動生成されるってことですね~。
多分…。

本では、ここから、scaffoldのカスタマイズとして、
[RAILSROOT]/app/contorollers/schedules_contoroller.rb
編集に入りますが、見事にlist関数なぞありません。

ここからは、listをindexに読み替える必要があるようです。
index関数を書き換え、本にあわせます。

今度は以下のエラーが…。
NoMethodError in SchedulesController#index
undefined method `paginate' for #<SchedulesController:0x8c3c99c>

rails2.xから、paginateもplugin化され、分離されています。
pluginを探すには、以下のようにする。

> script/plugin list

ここで、またエラー。

> script/plugin list
/usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27: command not found: svn ls svn://rubyforge.org/var/svn/expressica/plugins/

svnコマンドを使うには、subversionがいる。(これは別記)

> ruby script/plugin list | grep paginate
will_paginate                 http://tools.assembla.com/svn/breakout/breakout/vendor/plugins/will_paginate/
will_paginate                 svn://errtheblog.com/svn/plugins/will_paginate/

> ruby script/plugin list | grep classic
classic_pagination            http://tools.assembla.com/svn/breakout/breakout/vendor/plugins/classic_pagination/

classic_paginationはメンテされてないらしいので、will_paginateの方がいいということですが、差異が結構あるので本にあわせて進むなら、classic_paginationの方がいいでしょう。

ruby script/plugin install will_paginate

使い方は[RAILSROOT]/vendor/plugins/will_paginateのREADMEとかを見ます。

> vi [RAILSROOT]/app/contorollers/schedules_contoroller.rb
  def index
#    @schedules = Schedule.find(:all)
#
#    respond_to do |format|
#      format.html # index.html.erb
#      format.xml  { render :xml => @schedules }
#    end

# classic pagination & old paginate
#    @schedule_page, @schedules = paginate(:schedules, :per_page => 10)

# will_paginate
#     @schedules = Schedule.paginate(:page => params[:schedules], :per_page => 10)
     @schedules = Schedule.paginate(:page => params[:schedules], :per_page => 30, :order => 'datetime DESC')
  end

p75のテストデータは"schedule1:"、"schedule2:"、"schedule3:"
ではなく、"one:"、"two"、"three"で書かないと、
下記のようにテストデータにoneがないと怒られる。

$ rake
1) Error:
test_should_destroy_schedule(SchedulesControllerTest):
StandardError: No fixture with name 'one' found for table 'schedules'

p77のデザインのカスタマイズでapp/views/layout/schedules.rhtmlを
編集するよう書いてあるが、rails2.xのscaffoldが作るファイルは.rhtmlから.html.erbに変更され、各Viewの中身を表示する"<%= @content_for_layout %>"の部分は、"<%= yield %>"に変更されている。
意味は変わらないようだ。

追記: scaffoldの引数のところで、本来"datetime:timestamp"であるはずが"datetime:times tamp"になってました。orz

参考文献 : はじめようRub on Rails 高橋征義 監修 かずひこ、喜多川豪著 ASCII 刊

|

« はじめようRuby on Rails(初版)をRails2.xでやってみる STEP-1(4章) | トップページ | モバイルスイカで新幹線 CM »

FreeBSD」カテゴリの記事

Rails」カテゴリの記事

コメント

--skip-migrationが必要というところが
非常に助かりました.

これはエラーなのかどうか気づきづらく,非常に時間をとってしまいました.
危うくさらに長い時間をかけるところでした.
本当にありがとうございました.

--
No author 様
お役に立てたようで、何よりです。
私も未だ学習者であり、間違っているなど問題点ありましたら、ご指摘いただけると嬉しいです。

[るな~る]

投稿: | 2008年5月11日 (日) 14時14分

勉強させてもらっています。
本では、utf-8 で保存とありますが、私の環境では関連ファイル全てを utf-8n で保存しないとダメでした。utf-8 の識別コードが原因だったのかもしれないと考えています。

--
hideaku 様
私の環境では、UTF-8がdefaultとなっており、特に意識したことはありませんでしたが、これはファイルを編集しているエディタの問題のようです。

保存コードを選んでる時点で、おそらく編集をWindows等でやっていると思われますが、UTF-8には2種類あり、BOM(Byte Order Mark)というUTF-8の識別子(ヘッダ?)をもったものをUTF-8と呼び、ないものをUTF-8nと呼ぶようです。

しかし、UNIXの世界というかWeb開発においてはUTF-8に識別子がないのが普通のようで、BOM付きは問題になります。
Windows等で編集したものをuploadするときは、UTF-8nで保存しなくてはならないみたいですね。

[るな~る]

投稿: hideaku | 2008年8月21日 (木) 14時34分

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/205130/40271470

この記事へのトラックバック一覧です: はじめようRuby on Rails(初版)をRails2.xでやってみる STEP-2(5章):

« はじめようRuby on Rails(初版)をRails2.xでやってみる STEP-1(4章) | トップページ | モバイルスイカで新幹線 CM »