Ruby on Rails: 2007年5月アーカイブ

RadRailsでステップ実行

| | コメント(0) | RadRailsでステップ実行

EclipseのRuby on Rails開発環境、RadRails and Ruby Development Tools (RDT)がバージョンアップ(といっても5/14の様だが)されていて、ついにEclipse内でステップ実行が出来るようになっている。

コードを追いかけながら動きを掴めるのは初学社にはありがたい。

ServersビューのWEBrickやMongrelサーバのプロパティーを表示すると、「Run Mode」というのが追加されていて、ここを「run」から「debug」に変更するとOK。

radrails_runmode.jpg

既にインストールされている場合は「Help」メニューの「Software Updates → Manage Configuration → Search for updates of the currentry installed features」からRadRailsが最新かどうかの確認と、最新ではない場合はアップデートできる。

まだ入ってないなら「Software Updates → Find and Install... → Search for new features to install」で http://update.aptana.com/install/rails/3.2/ をURLに追加して続ければOK。


ただし、かなり動作が遅くなるので、常時debugモードにしておくとストレスがたまりそうですが(笑)

Amazon ECSですが、以前のエントリーamazon-ecsを使うつもりと書いたのですが、これカテゴリーのトラバースをするOperationであるところのBrowseNodeLookupに対応していなさそうな感じ。

カテゴリーは結構使えそうな情報なので、他を当たってみたところ、素直(なのかどうなのか分りませんが)にNet::HTTPREXMLで自分でやっても大したこと無さそうだという結論に。

試しにBrowseNodeLookupでサブカテゴリーにどんどん降りていくRailsアプリを書いてみたが、わりとすぐにできた。それもリクエストとレスポンスは開始1時間後にはできていて、そのあとREXMLの使い方がイマイチ分らず悩んでいただけでした。

やってておかしくないのにもかかわらず、XMLは何故だか使ったことがなかった私(笑)

Ruby on RailsでViewに<input type="text"/>タグを出力する際、

text_field() と text_field_tag() があって、どちらを使えばよいのか分らず暫くキョトーンとしていたのですが、やはりライド・オン・Railsは優れています。最後の「付録 Appendix」のリファレンスに一言で分りやすく記載されていました。

ヘルパメソッドリファレンス(P353, 357)より参照。

■text_field() 達のグループ。
 ActionView::Helpers::FormHelper
 モデルを対象とするヘルパです。

■text_field_tag() 達のグループ。
 ActionView::Helpers::FormTagHelper
 モデルオブジェクトではなく、値を対象とするヘルパです。

すなわち、

・前者はテンプレートにアサインされたRailsのモデルオブジェクトとその属性にアクセスできるように、
・後者はHTMLタグの名前と値からアクセスできるように

HTMLタグをレンダリングするということらしい。前者が高レベル、後者が低レベルなAPIとも言えましょうか。

ちなみに、同じくここで知りましたが、tag()、content_tag() というパラメータで渡された名前とハッシュによる属性指定(および、content_tag()の場合はcontent部)によって、どんなタグでも生成できる、ヘルパーも発見。

divの様なタグを<%= %>の中で生成できて、Rubyの変数へのアクセスがし易くなり、コードも見やすくなる効果があるそうだ。

良く考えられている。

例によって、これで1時間近く悩んでいたのであった。そんな訳でコーディングがなかなか進まない。しかし納得したので気持ちは良い。

当然作るアプリは最初、日本語が使えれば良いということで、viewなどはガリガリ日本語で直接書いてしまうのが、手っ取り早くて良いような気がした。

しかし性格的に全体がカッチリしてないと次に進めないのか、多言語対応するための仕組みを調べ始めてしまう。めっちゃ参考にしているライド・オン・Railsでは、Special-GenerationとRuby-GetText-Packageが紹介されている。

Supecial-Generationはscaffoldジェネレータの拡張で、多言語対応というより、Ruby on Railsの中の日本語に対応しているミニフレームワークと言った雰囲気。ちょっと私の趣味に合わない気がしたのでスルーの方向で。

Ruby-GetText-Packageはスタンダードっぽい。こっちを採用し、ごにょごにょ始めることに。

躓いたのは、InstantRailsでpoファイルのマージが出来ないというところ。ライド・オン・RailsではRakefileを拡張し、rakeタスクとしてpoファイルを作成できるようにしているが、内部でmsgmergeというコマンドが使われており、それが見つからないらしい。msgmergeはGnu GetTextのコマンドの様だ。

> rake update_po (in Y:/usr/home/iwazawa/workspace/hogehoge) po/hogehoge.pot Y:/usr/local/InstantRails/ruby/bin/rake.bat: No such file or directory - msgmerge po/hogehoge.pot tmp.pot rake aborted! You have a nil object when you didn't expect it! You might have expected an instance of Array. The error occurred while evaluating nil.empty? Y:/usr/home/iwazawa/workspace/hogehoge/rakefile:16 (See full trace by running task with --trace)

InstantRailsのRubyのインストールセットの中にrmsgmergeというコマンドがあり、これをGnu GetTextの代わりに使えるという情報をゲットした。やり方は<InstantRails install path>\use_ruby.cmdファイルに

set MSGMERGE_PATH=<InstantRails install path>\ruby\bin\rmsgmerge.cmd

という行を追加するというもの。これではInstantRailsのruby用コマンドプロンプトからしか実行できないが、radrailsでPATHを指定する方法が分らず妥協するとする。

あと、use_ruby.cmdファイルの冒頭のコメント部に、「このファイルはInstantRailsによって生成されるので、テンプレートな<InstantRails install path>\conf_files\use_ruby.cmdファイルを編集するように」といった、お達しがあるのだが、言われるままに変更してもいっこうに、コマンドプロンプトの環境が変わらなかったため、仕方なく直接書き換えました。

Railsでコードを書き始めたのだが、意外とサクサク進まない。

こちとら、JavaでHibernateでバリバリ書いていたという自負(苦笑)があり、Railsのテーブル関連も、最初にRailsによるアジャイルWebアプリケーション開発を読んだとき、特に引っかかることもなくすらすら読めたし、Railsのmigrationも良くできている。Controllerだって、Strutsに比べたら簡単そうだ。Viewに関しては更に、である。

しかし実際にコードを書きながら進めていくと、この場合、モデルやコントローラを作るのか作らないのか、名前はどうするの?など、規約を知らないために右往左往してしまっている。本を読んでいると、分らないことは特になく、何でも今すぐ作れそうな気がしてしまうが、自分がやろうとしていることを、どうやるのかがすぐには分らない。

ウリであるところの規約は、規約自体を知らなければ意味がないと言うことです(笑)

いや別にRailsをけなしているわけではなく、これは当たり前のことで、今までの開発ツールであれば、

(1) 設定方法を調べ
(2) 設定し
(3) 設定を使う

といった3段階でやっていたことを、

(1) 規約を調べ
(3) 規約を使う

の2段階にしてくれる上に、感覚的には前者の(1)、(2)の難易度は後者の(1)よりも相応難しかったはずです。

ツールの使い方につても、習熟が足りない。generate modelやscaffoldや、rake db:migrateやその他、いろいろをいつやって、何ができて、本当にやっていいの?など迷う。

今はまだRailsをさわり始めたばかり(しかもほぼ休日の数時間)なため、なかなかノリが見えてこないが、慣れたらいけるはず。出来る子のはず(笑)

ある程度の規模のアプリを書くためにはRailsの規約の何パーセントくらいが分ったらサクサクいけるのかを身をもって体験していきたいと思います。今のところ…20%くらいか(自己申告)

連休にRuby on Railsでいろいろと試していたのは、もちろん作りたいサービスがあるからです。
それにはAmazon ECSを使うつもりであります。

処理自体は先日試した amazon-ecs プラグインで比較的簡単に書けそうですが、ECSからどのような情報が取得できるのかなど、具体的なところは、ちゃんとAmazon E-Commerce Service Developer Guideを見ないと分りません。

そして、もちろん英語なのでどの情報が必要なのか、いささか苦労しながら(笑)探したtころ、当面必要である、書籍の検索には次のリファレンスを見れば分りそうです。

上から、


  • 操作の種類の一覧
  • 商品検索操作の詳細
  • 結果取得グループの一覧
  • Mediumグループの結果の項目

といったところでしょう。Response Group(結果取得グループ)には用途によって様々な結果の取得パターンがあるようです。おそら私はくMedium Groupがちょうど良さそうです。

明日は早速、検索部分を作ってみたい。

ライド・オン・Rails ですが、面白そうなので、リファレンス系のページはばっさり飛ばして、「Amazon Webサービスとの連携」やってみます。

本ではruby-amazonを使っての説明ですが、ちょっと調べると、amazon-ecs がよさげ。gemで簡単にインストールできます。

gem install amazon-ecs

そうするとサンプルも書き直さないといけない。こんな感じか。

def amazon_search @books = [] if request.post? require 'rubygems' require 'amazon/ecs' access_key = "your access key" associate_id = "your associate id" country = :jp Amazon::Ecs.options = { :aWS_access_key_id => [access_key], :associate_tag => [associate_id], :country => country } res = Amazon::Ecs.item_search(params[:keyword], { :search_index => 'Books', :sort => 'salesrank', :response_group => 'Medium' } ) if res.has_error? flash[:notice] = "Amazon ECSよりエラー:" + res.error return end res.items.each do |item| book = Book.new book.isbn = item.get('isbn') book.name = item.get('title') book.author = item.get('author') smallimage = item.get_hash('smallimage') if smallimage book.small_img_url = smallimage[:url] else book.small_img_url = 'noimage.gif' end book.manufacturer = item.get('publisher') book.release_on = item.get('publicationdate') @books.push book end end

本ではruby-amazonが返すオブジェクトをそのまま使ってビューをレンダリングしてるが、amazon-ecsはイメージURLの持ち方が単純でないので、Bookモデルに詰め替えることにします。small_img_urlというフィールドを勝手に追加してます。
この辺、Rubyに慣れてないんでアドホックですが、たぶんそのうちクールな方法を習得するはず。今は一杯一杯。

Ruby Amazon E-Commerce REST Service API (amazon-ecs)によると、

# or you can also do it this way atts = item.get('itemattributes') atts.get('title') # get only returns the first element of an array atts.get('author') # 'Author 1'

という風に、AmazonのAPIドキュメントAttributes of Items in the Book Storeに忠実に取得できて気持ちいいと思い、使おうとしたのですが、

atts = item.get('itemattributes')

が返すオブジェクトがgetメソッドがないと仰る…それで色々と試した結果、itemオブジェクトから直接getはできる様なのでそっちでやりました。

そして、これを表示するビューは、こんな感じか、

<%= form_tag %> keyword: <%= text_field_tag 'keyword', params[:keyword] %> <%= submit_tag 'search' %> <%= end_form_tag %> <table> <tr> <th>ISBN</th> <th>authors</th> <th>image (small)</th> <th>manufacturer</th> <th>product_name</th> <th>release_date</th> </tr> <% @books.each do |book| -%> <tr> <td><%=h book.isbn %></td> <td><%=h book.author %></td> <td><%=image_tag book.small_img_url %></td> <td><%=h book.manufacturer %></td> <td><%=h book.name %></td> <td><%=h book.release_on %></td> </tr> <% end -%> </table>

まだまだ拙いが、なんとなく分ってきたかな。

早くRuby on Railsを自由自在に使いこなしてアプリを作り始めたいのだが、そうこうしているうちに大連休の最終日夕方(死)
やはり、そう甘くはないと言うことで(笑)しかしRuby on Railsはこの先、相当な武器になりそうなので、やっていく。

まだまだライド・オン・Rails 頑張ってます。この本、もう少し先の「Railsエッセンシャルズ」という章を先読みしたのですが、リファレンスとしても、非常に優れてました。解説も非常に分りやすいし、記載の内容が少し古い(書籍では仕方ないですね)以外は、とても満足してます。買って良かった。

グラフィカルなカレンダーを表示するという所で、CalendarHelperというのが紹介されていて、実際にサンプルを動かすのですが、記載のサイトに行ってみると、DynamicCalendarHelperと、名前もグレードアップしている雰囲気です。

本では.rbファイルをダウンロードしてきて所定のフォルダにコピーというインストール方法で説明されていますが、プラグインのインストールに対応したようです。

ruby script/plugin install http://topfunky.net/svn/plugins/calendar_helper/

で、サクっとインストール完了。

しかし、ということは、本の通りにはいかないということで、やはり最初の例でつまずく。
まずは


vendor/plugins/calendar_helper/README

を読んでみると、
script/generate calendar_styles

をしとくようだ。あとはRDocを読めと書いてある…Rails、というかRuby初心者には、すぐにはどうして良いのかわからない。

今までの経験を元に、application.rbにrequire 'calendar_helper'を、application_helper.rbにinclude CalendarHelperを追加したところ、なんと成功!

引き続きライド・オン・Rails を進めております。

サンプルでlogin_engineというユーザ管理を全部やってくれる仕組み(プラグイン?)を使っているので、言うとおりにやっていたのだが、またもハマる。db:migrateができない。本の内容にくわえて、ちゃんとバージョンが違った場合に備えてLoginEngineのREADMEも参照しながらやったのだが、全くうまくいかない。

どうも、LoginEngine.configというメソッドを呼べないらしいのだが、environment.rbに言うとおりの記述を追加しているし、なんだか悪くないと思われるのだが。

またも行き詰まってしまったので、Google先生に頼ってみると。見つけた。

Rails 1.2.3でEngines及びLogin Engineプラグインを利用する

このレポートは激しく素晴らしい。これがなかったら私もEngines 1.2 Releasedを、さらに拙い英語力で読み解いている間に休日が終わってしまうところでした。感謝感激であります。

しかし、Rails思ってた以上に躓いてしまう。まぁ、あんまり簡単だと、それはそれでつまらないから良いか(笑)

ライド・オン・Rails 62P より

すべてのコントローラ共通の振る舞いはapp/controllers/application.rbに記述します。これは、すべてのコントローラクラスはApplicationControllerを継承するからです。

これは、本質的に重要っぽい。良く覚えておこう。

フレームワーク全体のノリが分るようになるまで、なかなか大変。面白いけど。

login_engineを使ってみる説明の所なのだが、ApplicationControllerのbefore_filterにフィルタを噛ましている。これでこのアプリケーションの全アクションでlogin_requiredを強制させられるという寸法か。

ライド・オン・Railsのlayoutファイルを修正する所で、

… <%= @content_for_layout %> <br /> …
と @content_for_layout というインスタンス変数が出てくる箇所が、scaffoldが生成したコードでは yield という変数(?)に変わっていた。

ググったところ、SaikyoLine.jpの@content_for_layoutって。というのを発見。なるほどです。しかし、これ去年の9月のだ。私はかなり遅れているなぁ。

ライド・オン・Rails 56P より

「ビューで共通に使うメソッドは、ヘルパーモジュールの中に定義します」

こういう情報は、サラっと書かれているが重要だ。おそらくRailsに慣れ親しんでいる人達にとっては、当たり前。当たり前すぎて書かれないことが多い類の情報と見ました。井沢元彦の受け売りですが。

これは、なかなか素敵な仕組みだ。認証チェックにはやっぱり普通、コレですかね?
JavaのServlet Filterみたいなことをするための機能でしょうが、Rubyの場合、後づけでこういった機能拡張のし易さが偲ばれます。

ライド・オン・Rails通りに進めているわけですが、formの機能の単体テストを実行すると

DEPRECATION WARNING: end_form_tag is deprecated and will be removed from Rails 2.0 See http://www.rubyonrails.org/deprecation for details. …

とか言われてしまう。廃止予定っていいな。end_form_tagって識別子がよっぽど気に入らなかっただろうか(笑)

end_form_tag は単なる end に変わるらしい。Rails Forumを参照。

しかし、格好いいかどうかは別にして、私は end のみより end_form_tag の方が読みやすい気がするのだが。

また、前回の続き。

できた!
プロジェクトの設定を見ていても全くうまくいきそうな気がしなかったので、Instant RailsのMySQLの起動設定ファイル、my.ini (Windows以外のプラットフォームだとmy.confのことですね?)で

default-character-set=utf8

としたら、ちゃんとutf8でDBとテーブルが生成されるようになり、文字化け解消。単体テストtest:unitsも見事に通りました。

ちなみにInstant Railsのmy.iniファイルはExplorerから探しまくらなくとも、メニューのConfigure⇒MySQLで開けます。

ただ、これって、そういうもんなのか。何となく腑に落ちない。database.ymlの指定くらいはちゃんと見てくれても良いと思うのだが。

確かにライド・オン・Rails Ruby on Railsを徹底攻略ではMySQLのインストールでデフォルトの文字セットは「Best Support For Multilingualism」を選べとなっていて、そうするとutf8になるのだろう。

これはInstant Railsが日本で使うにはちょっとインスタントじゃなかったという事だ。しかしもっと早く気づいても良いとは思う>自分。

前回の続き。

db:test:clone_structure というrakeタスクがあるのを見つけたので、実行してみると、ちゃんとutf8でDBとテーブルができた。

しかし、test:unitsを実行すると、またlatin1_swedish_ciである。君はスウェーデンが好きだな!

Rails

| | コメント(0) | Rails

Railsやってます。RailsによるアジャイルWebアプリケーション開発は随分前から持っていて、通勤時間などを使って、わりと読んだんですが、やはり知識と実地はかなり違っていて、じっさいにやってみると手が止まる。ちょっと、この本、通しでやるには重くて、この休み中それだけで終わってしまいそうな雰囲気。
本屋に月刊マガジンを買いに行くついで(?)に他のRails本を見てみると、ライド・オン・Rails Ruby on Railsを徹底攻略が目にとまった。短時間に一通り会得するのに良さそうだ。時間節約のために3000円使った(笑)

しかし、今までの経験から、どうせ色々細かいところはWEBの権威あるソースを参照しないといけないとは思います。

そして、さっそく夕飯後に初めたのだが、やはりつまらないところでハマる。単体テスト実行するってところで、言うとおりにすると、テーブルのデフォルトエンコードが latin1_swedish_ci なるエンコードになり、データはutf8で入れてるので文字化け。DB自体をutf8で作っておいても、latin1_swedish_ciで作成し直される始末。開発用DBのmigrateはうまくいくのだが、test:unitsだとそうなる。database.ymlでも全てのスキーマ定義でちゃんとutf8を指定しているし、念のために ActiveRecord::Migration の create_table にデフォルトをutf8にするオプションを書いても、test:unitsはダメ。あう~。

数ヶ月前にRuby on Railsを試してみようと調べたところ、Instant Railsが楽だったので、今回も使うことにして、バージョンをチェックすると1.3a。
今の最新は1.7という事なんで、ダウンロードだ。

How To Upgradeによると、


  • 既存のディレクトリに上書きするな!新しいディレクトリに展開すべし。
  • DBデータがあるなら、.../mysql/dataをコピーすべし。MySQL 4.x→5 はdumpしてimoprtすべき。
  • 各種設定ファイルを変えてたら、コピーすべし。それはApacheのhttpd.conf、MySQLのmy.ini、PHPのphp.iniの事。
  • railsアプリケーションをコピーすべし。
  • Instant Railsを起動すべし。新しいパスで設定ファイルがアップグレードされる。
  • environment.rbを編集すべし。RAILS_GEM_VERSION = '1.2.3'に変更しないとmigrateが起動しない。

前のInstant Rails 1.3aからは特にこれといって引き継ぐこともないので、全部やらなくても大丈夫そうだ。

アップグレードしなきゃいけない人で気をつけるべき所は、おそらくMySQLのデータ移行だろう。ChangeLogを見ると、バージョン1.6でMySQLのバージョンが5.0.27に変わっている。前は4.1.x系だったので説明の通りdump/importが必ず必要でしょう。まぁInstant Railsはそれぞれのフォルダ単体で起動するので、既存ディレクトリに上書きさえしなければ、古いのを起動してdump、新しいのを起動してimportとやれば簡単なはず。


そして、予想通りサックリ起動。phpMyAdminにもサックリ接続。サンプルアプリケーションもサックリ起動し、サックリ接続。さすがInstant Rails。まず最初の作業はMySQLのrootユーザにパスワードを設定して、開発用DBユーザを作成する事からか。

サンプルアプリのtypoですが、簡単なBlog管理ツールだ。えらい良くできてるなぁと関心しきり。ただ記事のポストができなかった。なにか設定が足りないのかも知れない。このコードは後で参考になりそう。

このアーカイブについて

このページには、2007年5月以降に書かれたブログ記事のうちRuby on Railsカテゴリに属しているものが含まれています。

次のアーカイブはRuby on Rails: 2007年6月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

imayomi(今読ミ)

ログール

Powered by Movable Type 5.04
あわせて読みたい