« はじめようRuby on Rails(初版)をRails2.xでやってみる 番外編(付録A) RDOC(gem server) | トップページ | ANA スーパーエコ割 CM »

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 刊

|

« はじめようRuby on Rails(初版)をRails2.xでやってみる 番外編(付録A) RDOC(gem server) | トップページ | ANA スーパーエコ割 CM »

FreeBSD」カテゴリの記事

Rails」カテゴリの記事

コメント

コメントを書く



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


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



トラックバック

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

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

« はじめようRuby on Rails(初版)をRails2.xでやってみる 番外編(付録A) RDOC(gem server) | トップページ | ANA スーパーエコ割 CM »