「つぶやき」アプリを改修してみよう(後編)を3rdRailを使わないでやってみようの巻(3)

さらに、昨日の続き。「つぶやき」アプリを改修してみよう(後編) − @ITの内容を、3rdRailを使わないでやってみる。

Favoriteモデルの追加

モデル名にはfavorite、属性にはuser_idとhitokoto_idを、それぞれinteger型で指定します。それぞれの属性の[必須]列にもチェックを入れておきましょう。[生成されたリソースのスカフォルドを作成する]チェックは外します。

http://www.atmarkit.co.jp/fcoding/articles/3rdrail/04/3rdrail04a.html

とのことなので、昨日userを追加した時と同じようにやる。

% ./script/generate resource favorite user_id:integer hitokoto_id:integer
      exists  app/models/
      exists  app/controllers/
      exists  app/helpers/
      create  app/views/favorites
      exists  test/functional/
      exists  test/unit/
      exists  test/unit/helpers/
  dependency  model
      exists    app/models/
      exists    test/unit/
      exists    test/fixtures/
      create    app/models/favorite.rb
      create    test/unit/favorite_test.rb
      create    test/fixtures/favorites.yml
      exists    db/migrate
      create    db/migrate/20090502093551_create_favorites.rb
      create  app/controllers/favorites_controller.rb
      create  test/functional/favorites_controller_test.rb
      create  app/helpers/favorites_helper.rb
      create  test/unit/helpers/favorites_helper_test.rb
       route  map.resources :favorites

で、「必須」を3rdRailでチェックした時には、「validates_presence_of ...」をmodelに追加しておくことにする。

% cat app/models/favorite.rb
class Favorite < ActiveRecord::Base
  validates_presence_of :user_id
  validates_presence_of :hitokoto_id
end

favorite classのunit test

もう「つぶやき」アプリを改修してみよう(後編) − @ITの内容のままに「test/fixtures/favorites.yml」を修正しておく。
さらに、「test/unit/favorite_test.rb」と「test/unit/user_test.rb」と「test/unit/hitokoto_test.rb」もそのまま作成する。日本語文字列が入っているので、文字コードutf-8にしておく。Emacs.appでYAMLを使う時はyaml-modeが便利だろうと思いつつ、インストールはまたの機会に。
「rake db:test:prepare」してから、unit test実施。

% rake db:test:prepare
(in /Users/fukuit/Projects/tsubuyaki)
You have 1 pending migrations:
  20090502093551 CreateFavorites
Run "rake db:migrate" to update your database then try again.
% rake db:migrate
(in /Users/fukuit/Projects/tsubuyaki)
==  CreateFavorites: migrating ================================================
-- create_table(:favorites)
   -> 0.0014s
==  CreateFavorites: migrated (0.0016s) =======================================
 
% rake db:test:prepare
(in /Users/fukuit/Projects/tsubuyaki)
% 

そういえば、modelにfavoriteクラスを追加してから、DBをmigrateするのを忘れてた。「rake db:migrate」してから、「rake db:test:prepare」しておいた。

% rake test:units(in /Users/fukuit/Projects/tsubuyaki)
...(中略)...
8 tests, 2 assertions, 0 failures, 6 errors
rake aborted!

というワケで、めでたく失敗した。

クラスの実装

後は、「つぶやき」アプリを改修してみよう(後編) − @ITの通りに、「app/model/favorite.rb」、「app/model/hitokoto.rb」、「app/model/user.rb」を修正する。

% rake test:units
(in /Users/fukuit/Projects/tsubuyaki)
/opt/local/bin/ruby -I"/Users/fukuit/Projects/tsubuyaki/lib" -I"/Users/fukuit/Projects/tsubuyaki/test" "/opt/local/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake/rake_test_loader.rb" "test/unit/favorite_test.rb" "test/unit/helpers/favorites_helper_test.rb" "test/unit/helpers/hitokotos_helper_test.rb" "test/unit/helpers/users_helper_test.rb" "test/unit/hitokoto_test.rb" "test/unit/user_test.rb" 
Loaded suite /opt/local/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake/rake_test_loader
Started
........
Finished in 0.05193 seconds.
 
8 tests, 8 assertions, 0 failures, 0 errors

というワケで、ここまでできた。
各classについては、とりあえずWebに書いてあるとおり入力しただけなので、なぜこう入力するべきなのか?等がイマイチ分かってないのが大問題だな。