「つぶやき」アプリを改修してみよう(後編)を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に書いてあるとおり入力しただけなので、なぜこう入力するべきなのか?等がイマイチ分かってないのが大問題だな。