Ruby on Rails: 2007年6月アーカイブ
URLとして、
という表記が良かったので、
という3セットを作って、index.rhtml内で使いたいhelperメソッドをhome_helper.rbに記述したのだが、何故かhelperメソッドが見つからないと言われる。具体的には次のようなプログラム。
そこで試しにhome_controller.rbに明示的に以下のように宣言を書いてみると動いた。
しかし、home_helper.rb(HomeHelperクラス)は規約に則っているので宣言は必要ないはずだ。おかしい。
原因を確かめるべく、再びコントローラに記述したhelper :homeの行を削除して元に戻してみると・・・なぜか今度はエラーとはならずちゃんと動く。う~む、気持ち悪い。
あらかじめ断っておきますが、オチはありません。
やっぱり「あらかじめ」は最初に使いたい。よく南武線に乗ってから、「京浜東北線が○○の理由により、現在運転を見合わせております。あらかじめご了承下さい。」などという放送がなされることがあるが、まったくあらかじめっていない。それならば、さっき先に来た反対方向、立川方面行きに乗って溝ノ口経由で行きたかった。
いきなり脱線してしまったが、Rubyの配列の要素数はsizeメソッドでもlengthメソッドでも良いらしい。ずっと何かの本にたまたま載っていたlengthを使っていたが、最近買ったRails本「Ruby on Rails入門―優しいRailsの育て方」ではsizeを使っていたのでアレっと思っただけです。
ひょっとして、全てのオブジェクトに実装されている?
Fixnumはsizeがあってlengthがない、Floatはどちらもないのが面白い。Fixnumのsizeは何を表すのだろうと思い、調べたら実装上のバイト数らしい。
なかなか面白い。しかし、その理由ならFloatにsizeがあっても良いように思われるのだが。まぁ、配列と文字列以外では必要なさそうなので、深く考えない事にしよう(オチなし)
自分のための覚え書き。
デバッグのためログにいろいろと出力する場合、logger.debugに食わせてオブジェクトの内容を簡単にダンプする方法。
2. obj.inspect
3. obj.pretty_inspect
1.は数値や文字列など段純なオブジェクト向き。コンテナーなどの場合はオブジェクトIDの文字列表記となる。
2.はコンテナのような複雑なオブジェクトの内容が分るように文字列に変換してくれる。
3.はもっと見やすく整形した文字列に変換してくれる。
DBマイグレーションで既に存在するテーブルにカラムを追加後、そこに他の項目値によってデフォルト値を自動で突っ込みたくなり、少々はまりましたので、覚え書き。
Hogeというモデルがあり、progressという項目に0 .. 9の範囲で進捗度が格納されているとする。
progressの9は完了なのだが、9に設定された日を格納するcomplete_dateというdate型の項目を追加したい。既存のレコードにはprogressが9で、complete_dateがNULLの場合、complete_dateに今日の日付を入れる。
で、マイグレーションでは普通にRubyのコードも書ける様なので、こんな風にしてみた。
しかし、うまくいかない。小一時間んで、RailsによるアジャイルWebアプリケーション開発のマイグレーションの項目を読み直して見たところ、発見。
モデルの変更があったことをActiveRecordに知らせないといけない。よく考えると当たり前だ。具体的には下記をadd_columnとupdate_allの間に挟むということ。
RailsによるアジャイルWebアプリケーション開発はRails0.9ベースに書かれていて、脚注と付録で1.0をサポートしている、結構古めの内容だが、Railsの全体と、重要なイディオムを習得するために最近Railsをやり始めた人もやはり目を通しておくべき本だと思います。
タイトルはbindingですが、直接的に組み込み関数のbindingやBindingクラスの事ではありません。関係はありますが。
最近、書いているAmazon ECSを検索して、ごにょごにょする処理で、ECSのResponseの中(ResponseGroup=Mediumには含まれている)にBindingという項目があります。本の種類(親書、単行本、文庫)などが取得できます。
そこで、ECSの情報をキャッシュするテーブルEcsBookというクラスを作って、binding項目もそのままbindingという項目名としました。
そうすると、DBからこのテーブルのレコードを読んでくる際
こんなエラーが発生するようになった。
実は、このエラーがこの項目bindingのせいだと気づいたのは、何時間も悩んだあげく、Ruby on Rails: beware of reflection errors [<blink> Tech notes for the greater good]というページをググって見つけたから。
英語は不得意なもので、正確には分らないですが、evalやbindingとかBugとか言っている。
これはActiveRecordがbindingというカラム名を誤認識して、リフレクションがおかしくなるのでは?と気づきました。
項目名bindingをecs_bindingに変えてみたところ見事、問題解決。
しかし分りにくいな。
先日のAmazon ECSを検索するサンプルクラスですが、いろいろと問題が。
まず、致命的なところでは、このクラスItemSearchとItemLookupに対応しているつもりなのに、ItemLookup時のエラー応答がハンドリングできていない。
というXPathでエラー応答があるかどうかをチェックして、エラーの場合はコードとメッセージを取得しているのだが、ItemSearchをハードコード(死)
こうだった。
また、このクラスはlibディレクトリの下において、Controller/Helper/Modelとは別扱いにしたのだが、そうするとloggerオブジェクトも使えなくて困った。上記のエラーコードとメッセージをlogger.warn()しておきたかった訳です。
しかしよく考えると、Controller/Helper/Moddelからloggerオブジェクトをいつでも使えると言うことは、loggerはクラスメソッド扱いか。明示的にクラス名を指定して
でOKだった。
Railsのコードを細々と書いています。
やりたいことをRubyの文法でどう表現するのかとまどうことが多く、思い切って週末にプログラミングRuby 第2版 言語編を買ってきました。
早速続きのコードを書きながら、分らない事を索引で引いて、ページを開く事を数回続けた結果、まったく索引のページにその記述がない!こんなに間違いの多い索引を平気で出版するとはどういうことかと、出版社に文句のメールを書こうかと思い始めたところ、索引の最初のページの脚注に説明がありました。
皆様もお気を付け下さい(汗)
プログラミングRuby 第2版 ライブラリ編も欲しいが、両方合わせて¥8,200円。うむ。
慣れない言語に四苦八苦しながら(といいつつ、かなり楽しんでいる)、Amazon ECSからデータを引っ張ってくるクラスを書いてみた。
まだRubyに不慣れなので、かなりアレなコードだと思われるが、夢中になってるとブログに書くのも忘れるので、とりあえずのネタとして。
中で使われている、SearchWordとEcsBookというクラスはそれぞれ、画面からの検索情報を渡すためのプレースホルダー、およびAmazonECSからの結果を保持し、DBへ格納するためのActiveRecordです。
ISBNが指定されている場合は、優先してISBN検索をするようにしたのだが、最近買った本(具体的には泣き虫弱虫諸葛孔明第弐部)のISBNを入れてみたところ、うまくいかない。
この本はISBNが従来の10桁ではなく13桁になっている(詳しくはWikipediaを参照のこと)。
ISBNが11桁以上だったら、IdTypeパラメータをISBNに設定(このとき、SearchIndexパラメータも必要となる)すると、ItemLookupオペレーションが動くことを発見。ちなみに10桁のISBNは、ASINと一致なので、IdTypeはASIN、もしくは指定しない(=ASIN)である。ASINの場合、面倒だがSearchIndexパラメータが指定されると逆にエラーとなる。
APIドキュメントによると、JPではIdType=ISBNはサポートされてないことになっているが、使えるから良いか。
どうせなら10桁の時も、IdType=ISBNで取得させてくれれば楽だと思うのだが、そうはなっていない。
RailsのおさらいもかねてWEB+DB VOL.32からの連載「Ruby on Rails Way」を読み返してみた。
そこでblank?メソッドを発見。前にも読んでるはずなのだが、やはり必要に迫られていないと、全く覚えていない物だ。
を一発で
と書けて気持ちがよい。Javaで仕事していたときは、Rubyの様な特異メソッドなぞは使えないので、普通に
なんて、やってたのを思い出す(笑)

