カテゴリー「FreeBSD」の24件の記事

2008年5月25日 (日)

Railsのテスト (覚書)

今までテストをする際に、ただ

> rake

としていた。
でも、これはrailsアプリ全体のテストをやっているので、時間が掛かる。

そこで、部分テストのやり方をメモ。

コントローラーのテスト([RAILS ROOT]/test/functionals以下全てのテスト)

> rake test:functionals

コントローラーのメソッドのテスト

> ruby [path to ruby test script file] -n [Method name]

モデルのテスト

> rake test:units

| | コメント (0) | トラックバック (0)

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

自爆なのだが迷宮入りして抜け出すのにかなり掛かってしまった…。
Cut&Pasteって怖い…。(爆)

p103においてverifyというメソッド説明しているのだが…、確かにこれが無いとdestroyメソッドを利用してデータを消されてしまう恐れがある。
しかし、これを本のとおりに足した場合、せっかくのRESTfulな環境がダメになる…。
config/routes.rbの部分で対応するのかと思ったが上手くいかない。

かなり強引だが、以下のようにしてしまった。

  verify(:method => [:delete], :only => [ :destroy ], :redirect_to => { :action => :month })
  verify(:method => [:post], :only => [ :create ], :redirect_to => { :action => :month })
  verify(:method => [:put], :only => [ :update ], :redirect_to => { :action => :month })

これに関しては、editメソッドでも同じ。
もっとスマートなやり方があるはずなのだが…。

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

| | コメント (1) | トラックバック (0)

2008年3月13日 (木)

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

1. Calendar Helper 設置、設定

calendar_helperですが、本ではサイトにアクセスして取得、設置するよう書かれていますが、現在はplugin insatllで簡単に入ります。

> ruby script/plugin install http://topfunky.net/svn/plugins/calendar_helper/
+ ./History.txt
+ ./MIT-LICENSE
+ ./Manifest.txt
+ ./README.txt
+ ./Rakefile
+ ./about.yml
+ ./generators/calendar_styles/calendar_styles_generator.rb
+ ./generators/calendar_styles/templates/blue/style.css
+ ./generators/calendar_styles/templates/grey/style.css
+ ./generators/calendar_styles/templates/red/style.css
+ ./init.rb
+ ./lib/calendar_helper.rb
+ ./test/test_calendar_helper.rb

本の通りに進めるとp95のブラウザで確認でエラーが…。

ActiveRecord::RecordNotFound in SchedulesController#show
Couldn't find Schedule with ID=month

'month'アクションを呼んでるのに、'show'が呼ばれて、IDとしてアクション名を渡してる…。

> rake routes

で確認してみると、確かに'month'はない。

rails2.xからは、controllerにアクションを直接記述しただけでは、アクションとして認識されていない。

試行錯誤の結果、個別表示(schedule/1 など)のないアクションを追加したい場合、map.resourcesに、collectionオプションを指定する事で、下記のようなroutesが追加される。
HTTPメソッドは指定しないとエラーになる。

> vi [RAILSROOT]/config/routes.rb
ActionController::Routing::Routes.draw do |map|
#  map.resources :schedules
  map.resources :schedules, :collection => { :month => :get }
  # Install the default routes as the lowest priority.
  map.connect ':controller/:action/:id'
  map.connect ':controller/:action/:id.:format'
end

> rake routes | grep month
          month_schedules /schedules/month {:controller=> "schedules", :action=>"month"}
formatted_month_schedules /schedules/month.:format {:controller=> "schedules", :action=>"month"}

resources(ActionController::Resources)の内容はRDOCと下記サイトを参考にさせて頂き
ました。

参考サイト
ザリガニがみていた…。 2.0のmap.resourcesのオプション設定いろいろ

routes問題はやり過ごしたが、 本のままだとObjectがnilだとエラーが出る。

> vi [RAILSROOT]/app/schedules_controller.rb(抜粋)
  # Month (use CalendarHelper)
  def month
    @year  = params[:year]  ? params[:year].to_i  : Time.now.year
    @month = params[:month] ? params[:month].to_i : Time.now.month

本のProgramでは@paramsはインスタンス変数で、ブラウザから渡された値をハッシュのキーで引いている感じなのだが、現在の仕組みではGET、POSTともにparamsメソッドを使って値を取り出すようだ。

他に気になる部分として、他の言語から入ってきた人には当り前だが、うん年前(爆)、私がProgram入門時は意味不明だったことを書いておく。

@year  = params[:year]  ? params[:year].to_i  : Time.now.year

上記は三項演算子といって、if文とほぼ同じ意味を持ち下記と同じになります。

if params[:year]
  @year = params[:year].to_i
else
  @year = Time.now.year
end

value = 式 ? value1 : value2
式が真ならvalue1、偽ならvalue2がvalueに代入されます。

詳細はRubyのリファレンスを参照。

[RAILSROOT]/test/functional/schedules_controller_test.rb
の追記は特に問題なし。

p98の[RAILSROOT]/app/controllers/schedules_controller.rbの追加部分、findメソッドの中のconditionsで、置換えらしき記述がある。(赤字部分)
? 部分に、それぞれ、@this, @nextが入るんようだ。
RDOCのActiveRecord::Baseに詳しい記述がある。

> vi [RAILSROOT]/app/controllers/schedules_controller.rb(抜粋)

    Schedule.find(:all, :conditions => ['datetime >= ? AND datetime < ?', @this,
@next]
).each do |schedule|

本ではstylesheetを置くように書いてあるので、[RAILSROOT]/vender/plugin/calendar_helperに探しにいくと。
READMEに下記コマンドで、cssファイルを作れと書いてある。

> ruby script/generate calendar_styles
      create  public/stylesheets/calendar
      create  public/stylesheets/calendar/red
      create  public/stylesheets/calendar/red/style.css
      create  public/stylesheets/calendar/blue
      create  public/stylesheets/calendar/blue/style.css
      create  public/stylesheets/calendar/grey
      create  public/stylesheets/calendar/grey/style.css

[RAILSROOT]/app/views/layouts/schedules.html.erbを"calendar/red/style"を参照する
ように変更したのだが、見た目がかなり違う。
諦めて、参照してたstyle.cssをcalendar.cssにコピーして、本に合わせて編集。

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

| | コメント (0) | トラックバック (0)

2008年3月 6日 (木)

はじめようRuby on Rails(初版)をRails2.xでやってみる 番外編(付録A) RDOC(gem server)

RDOCなどのDocumentを読みたいと思って、本の通りにgem_serverと打つと

> gem_server
gem_server: Command not found.

となってしまう。

RDOCが読めないと学習が進まないしどうしようかと思ったら…。

> gem server

で、問題なく立ち上がった。

'_'(アンダーバー)と' '(スペース)の差。

正誤表には載っていないので、gemの方で整理されたのかも知れない。
これは、わからなくて大変だったのでメモ。

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

| | コメント (0) | トラックバック (0)

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

2. DB登録条件(Validation)

何がどうなった場合に問題になるのかを、テストに記述してから、機能を実装するのがRailsのやり方のようです。

まずValidationのテスト項目を記述するように書いてあります。
これは、どこかから呼ばれるのかと思ったのですが、rake時は、SchedulesControllerTestクラスのメソッドは全て呼ばれるようです。
面倒じゃなくていいですが…。

scaffoldの雛型に合わせたもの(抜粋)

> vi [RAILSROOT]/test/functional/schedules_controller_test.rb
  def test_should_create_success_schedule
    assert_difference('Schedule.count') do
      post :create, :schedule => {:title => 'テスト'}
    end

    assert_response :redirect
    assert_redirected_to schedule_path(assigns(:schedule))
  end

  def test_should_create_failure_schedule
    assert_no_difference('Schedule.count') do
      post :create, :schedule => { }
    end

    assert_template 'new'
  end

assert_difference()は、Programの文脈からは、do~end内のpostの実行前後で値が変わってるかを見ているとわかります。
defaultでは+1でtrue、def test_should_destroy_scheduleをみると、差分を引数として渡すことも可能みたい。

do~end内の実行前後で、値が変わっていない場合にtrueになるのはassert_no_difference()、命名規則のせいかわかりやすいかな。

rakeでテストして、本の通りtest_create_failureで失敗することを確認して先へ

参考サイト
has_many :through

Validationはmodelクラスで実装

p87までのコードを加えてrakeでテスト

> rake
/usr/local/bin/ruby18 -Ilib:test "/usr/local/lib/ruby/gems/1.8/gems/rake-0.8.1/l
ib/rake/rake_test_loader.rb" "test/unit/schedule_test.rb"
/usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original
_require': /scheduler/app/models/schedule.rb:6: syntax error, unexpected $end, expecting kEND (SyntaxError)

error発生
errors.add 後のUnless条件式の途中に改行があると、errorが発生する。
よく考えれば、rubyの式の終了条件が';'(セミコロン)か改行なので当然。(^^;
※改行前の文字がバックスラッシュの場合は1文と解される。

ひょっとして本の間違い?
って、案の定ありました。

一番先に調べるべきところが違いますね。orz

> vi [RAILSROOT]/app/models
class Schedule < ActiveRecord::Base
  def validate
    errors.add(:title, "入力されていません") unless attribute_present?(:title)
  end
end

再度rake

> rake



Finished in 2.559977 seconds.
8 tests, 17 assertions, 0 failures, 0 errors

著者ページ正誤表
http://wiki.fdiary.net/rails/?hajimeyo_rails


3. データの削除

scaffoldが作った雛型を確認していくだけで終了なのだが、結構違う。

schedules_controller.rbはredirect_toの部分がrespond_toで柔軟に対応できるようになっているようなのだが、ツッコミ過ぎるとハマるので取りあえず先へ。

動作自体は、本の通りで問題ない。

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

| | コメント (0) | トラックバック (0)

2008年3月 1日 (土)

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

1. 登録画面カスタマイズ(render)

rails1.xと2.xの差が凄いのか、これでもかってぐらい違う…。
本では[RAILSROOT]/app/views/schedules/new.rhtml(→new.html.erb)を見ながら、renderの役割を学習するのだが、rails2.xのscaffoldが作り出す雛型には、renderなんて見当たらないし、"_form.rhtml"に相当するものもありません。

newの中身を見てみるとform部分は、form_for(ActionView::FormHelper)によってそれぞれに書かれています。
diffをとってみるとnew、editがほとんど同じものですね。

viewをそれぞれいじるっていうのが、現実的な解なのかもしれませんが、DRYって感じがしないし、new.html.erb、edit.html.erbをそれぞれいじるのも芸がないので、renderを使って本に近づけてみます。

以下のようにしてみました。

> vi [RAILSROOT]/app/views/schedules/_form.html.erb
<% form_for(@schedule) do |f| %>
  <p>
    <b>日付</b><br />
    <%= f.datetime_select :datetime, :use_month_numbers => true %>
  </p>

  <p>
    <b>タイトル</b><br />
    <%= f.text_field :title %>
  </p>

  <p>
    <b>内容</b><br />
    <%= f.text_area :content, :cols => 40, :rows => 10 %>
  </p>

  <p>
    <%= f.submit button_value %>
  </p>
<% end %>

> vi [RAILSROOT]/app/views/schedules/new.html.erb
<h1>New schedule</h1>

<%= error_messages_for :schedule %>

<%= render :partial=>'form', :locals=>{ :button_value=>'新規作成'} %>
<%= link_to '戻る', schedules_path %>

edit.html.erbも同様に合わせます。

下記サイトを参考にさせていただきました。

参照サイト:
ザリガニが見ていた...。 form_forブロックの中のrender :partialの悩み

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

| | コメント (0) | トラックバック (0)

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 刊

| | コメント (2) | トラックバック (0)

2008年2月25日 (月)

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

※ railsはinstallする時にversionを指定できますので(gem install rails --version [VERSION NO]等)、それに従ったほうが学習は捗るかと思います。(本にはversionを指定するように書いてあります。)

環境
DB   : mysql 5.0
ruby : ruby-1.86
gem : ruby18-gems-1.0.1
rails : 2.0.2

1. Databaseの用意

mysqlを特にoptionをつけずにinstallしているので、"character set utf8"をoptionを付けてDatabaseを作成。(development、test、production用をそれぞれ作成)

ex).
> mysql -u root mysql -p
mysql> create database scheduler_development character set utf8;
mysql> grant all privileges on scheduler_development.* to 'rails'@'localhost' identified by 'PASSWORD';

2. Projectの作成

(Rails2.xから標準データベースがSQLite3に変わったので、database optionにmysqlを指定)

> rails scheduler --database=mysql
/usr/local/lib/ruby/site_ruby/1.8/rubygems.rb:379:in `report_activate_error': Could not find RubyGem activeresource (= 2.0.2) (Gem::LoadError)

いきなりエラー…。
gemのactiveresourceVersionがあわないらしい。

# gem install activeresource
Successfully installed activeresource-2.0.2
1 gem installed
Installing ri documentation for activeresource-2.0.2...
Installing RDoc documentation for activeresource-2.0.2...

> rails scheduler_r2 --database=mysql

今度は問題なし
Project作成に使ったDirectoryの下にProject名のDirectoryが出来て、そこがRAILSROOTになる。

Databaseのアクセス設定

> vi [RAILSROOT]/config/database.yml

user、password以外は、変更なし。
encodingまで、utf8が既に入ってる。

本では、[RAILSROOT]/config/environment.rbに、$KCODEの設定するよう書いてあるが、私の環境では、特に足さなくても問題はなかった。

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

| | コメント (0) | トラックバック (0)

2008年2月20日 (水)

Subversion

Subversionのインストールが意外にてこずったのでメモ
サーバーとして動かすには下調べが足りてない。

# portinstall subversion



buildconf: checking installation...
buildconf: python not found.
           You need python installed
           to build APR from SVN.
*** Error code 1

Stop in /usr/ports/devel/apr-svn.
** Command failed [exit code 1]: /usr/bin/script -qa /tmp/portinstall.1356.4 env make
** Fix the problem and try again.
--->  Skipping 'devel/subversion' because a requisite port 'devel/apr-svn' failed (specify -k to force)
** Listing the failed packages (-:ignored / *:skipped / !:failed)
        ! devel/apr-svn (unknown build error)
        * devel/subversion

apr-svnでpythonが見つからないってことらしい。

# portversion -v | grep python
python25-2.5.1_1            =  up-to-date with port
# which python
python: Command not found.

# which python2.5
/usr/local/bin/python2.5

pythonないが、python2.5はある。
エラーを出している所を探してみる。

# cd /usr/ports/devel/apr-svn
# cd work
# grep "You need python installed" * -r
apr-1.2.8/build/buildcheck.sh:echo "           You need python installed"
# cd apr-1.2.8/build
# less buildcheck.sh

python=`build/PrintPath python`
if test -z "$python"; then
  echo "buildconf: python not found."
  echo "           You need python installed"
  echo "           to build APR from SVN."
  exit 1

ここで、pythonを置き換えてるから、ここで上手く引ければいい?
link張ってしまえばいいかな…。

# cd /usr/local/bin
# ln -s python2.5 python

# ls -la python2.5
-r-xr-x--x  1 root  wheel  944164  1 24 08:14 python2.5*
# ls -la python
lrwxr-xr-x  1 root  wheel       9  2 19 17:35 python@ -> python2.5
# cd /usr/ports/devel/apr-svn
# make install

今度は問題なし。

# cd /usr/ports/devel/subversion
# make install clean
Options for subversion 1.4.6_1
  [ ] PERL              Perl bindings
  [ ] PYTHON            Python bindings
  [X] RUBY              Ruby bindings
  [ ] JAVA              Java (JavaHL) bindings
  [ ] MOD_DAV_SVN       mod_dav_svn module for Apache 2.X
  [ ] APACHE2_APR       Use APR from Apache 2.X
  [X] NEON              WebDAV/Delta-V repository access module
  [X] BDB               db4 repository backend
  [ ] ASVN              Build and install Archive SVN (asvn)
  [ ] MAINTAINER_DEBUG  Build debug version
  [ ] SVNSERVE_WRAPPER  Enable svnserve wrapper
  [ ] BOOK              Install the Subversion Book

/usr/local/etc/pkgtools.confのMAKE_ARGSに追記

        'devel/subversion' => [
          'WITH_RUBY=yes',
        ],

今回は、railsのplugin listを動かす為なのでRubyのみチェック。
apache2、mod_dav、java辺りは事前にそっちを整えないとmakeがこけます。

| | コメント (0) | トラックバック (0)

2008年2月15日 (金)

gem update Memo

Railsを入れてから、だいぶ時間がたってしまった。
Gemまでは、Portsで管理できているが、Rails等のGEMSのパッケージは
gemコマンドで管理しなければならない。

といっても、実際には"--source"オプションを使ったもの以外は、下記コマンドで簡単にupdate可能。

# gem update [options]

上記の場合、defaultのserverから引ける、installされているgemをすべてupdate。
少し、変わってるのは、updateしてもold versionがuninstallされないこと。

古いversionで、GEMパッケージを動かすには

$ rake _[GEM VERSION]_
ex.)
$ rake _0.7.2_

互換性等で問題なければ。

# gem cleanup [GEMNAME]

で、old versionはunistallされる。

個別のupdateは

# gem update GEMNAME [options]
ex.)
# gem update rails

localに何がinstallされているかは

# gem list

最新versionを調べたい時は。

# gem list [GEMNAME] -r

先頭一致で検索できるみたい。

各コマンドのオプション等はリファレンスマニュアル(英語)を参照。

| | コメント (0) | トラックバック (0)

その他のカテゴリー

CM | FreeBSD | Linux | Rails | Ubuntu | 雑記