資料はmoroさんとursmさんのところに、
Rails Summer Festival 2008で話しました – moroの日記
以前いっていた通り、id:ursmといっしょにウェブキャリアさんのRails Summer Festival 2008で話してきました。
Ruby on Rails Summer Festival 2008 で話しました – ursmの日記
今回は3本立てで、id:moro が Capistrano と named_scope の話、私が Haml の話をさせていただきました。
動画が角谷さんのところに、
Rails Summer Festival 2008 の講演動画を公開しました – 角谷HTML化計画 (2008-08-28)
id:moroとid:ursmがしゃべったウェブキャリアさんのセミナーを撮影したのをニコニコ動画で公開しました。
すでにアップされています。仕事がね、はっやい。
いまはふつうに仕事しているとほぼ単独行動な感じになってしまうので、やはり現場での話が聞けるのはうれしい。
CapistranoでSubversionのパスワードを取るところ、Rubyを普段使い(Rails以外という意味で)してないと$stdin.getsは思いつかない気がするなー。
今日行ってきたウェブキャリアさんのセミナーで角谷さんに、「ソースはGistに張ったらいいんじゃない?」とコメントをいただいたので、このまえのAutotest::Screen
をさっそく張ってみました。
使ったことなかったけれど、これはべんり。これからはまるごとソースはこっちに張っていこうと思います。
あとは、自分がまだgitを使いこなせてないことが問題だ。(えぇー
class Curry < ActiveRecord::Base; end
class SeafoodCurry < Curry; end
class VegetableCurry < Curry; end
という関係のクラスがあって、CurryをAbstractクラスのようにしたかったので
validates_presence_of :type
を付けたのだけれど、これって普通のことなのかどうか気になる。
あと、出来心でtypeを存在しないクラス名に変えたら
ActiveRecord::SubclassNotFound: The single-table inheritance mechanism failed to locate the subclass
とおこられてARから触れなくなってしまった。ご注意。(って、普通はやらんか。)
すこし時間が経っているけれど、読み返しつつ。
薄いのだけれど、中身は詰まってる。なんというか「抜けのない」本だなという印象。
まず、章ごとにまとめがあるのに加えて、そこで扱っていないことが書いてある。これで「では○○はどうなんだろう?」という疑問に対して補完がされている。
また、ところどころで著者が「自分はこうしている」ということが書かれている。たとえばP37にある「doと{」の使い分けだとか、P115の「ifとunless」やP119の「timesとupto」など。
これが「○○と△△があるのは分かって、同じ結果になるのも分かったのだけれど、自分はどうしよう?」という疑問に対して、結果として選択を助けてくれる絞り込みになっている。(気がする。)
自分は後者でよく立ち止まって時間がかかるので、こう受け取ったのかもしれないが。
ともあれ、途中で放り出されることがないまま最後まで行けて、そのあともどこに向かえばいいか分かるようになっているという意味で「抜けのない」本だな、と。
他言語の経験があるプログラマ向けと明言されているだけに「じつは中がこうなっているからこうなんだよ」的なことが足跡マークにちりばめられていて、これも同様に迷ったときの判断の基準になってくれる。
こういうことって、ふつうの入門書には書いてなくて、でもどうやって聞いたらいいのか分からない(うまく言葉で表せない)ことだと思う。誰かの経験談を見たり聞いたりして「あーそれ気になってたんだよ」という感じで解けることが多い、クックブックやレシピと似てはいるけど、ちょっとベクトルが違う「なるほど」。
Rubyを使い始めて1年以上経ったので、もう「初めて」ではないと思っていたのだけれど、それでもこれを読んでコードが変わったところがあったり、そういうものだと鵜呑みにしていたところの裏付けが出来たりして、収穫があった。
始めたあとでも、そのRubyがさらにRubyまる本だと思う。
HTTP/1.1 200 OK
Status: 200 OK
この2つについて聞かれて、うまく答えられなかったので調べたメモ。
RFC 2616 – Hypertext Transfer Protocol — HTTP/1.1
Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF
RFC 3875 – The Common Gateway Interface (CGI) Version 1.1
Status = "Status:" status-code SP reason-phrase NL
後者はCGIのヘッダーフィールドなのかー。
class Curry < ActiveRecord::Base
end
class SeafoodCurry < Curry
end
class VegetableCurry < Curry
end
という関係のクラスがあって、
GetText.update_pofiles
でmsgidを抽出しようとしたのだけれど、対象となったのはCurryのみでSeafoodCurryとVegetableCurryは対象とならなかった。
このままではなにかと不便なので原因を追ってみました。
以下追跡ログ。キーとなった箇所は強調してあります。
gettext-1.92.0/lib/gettext/utils.rb
132 rgettext(files, refpot)
gettext-1.92.0/lib/gettext/rgettext.rb
241 file.puts generate_pot(parse(targetfiles))
170 @ex_parsers.each do |klass|
171 if klass.target?(file)
35 ["active_record.rb", "ActiveRecordParser"],
gettext-1.92.0/lib/gettext/parser/active_record.rb
135 if @ar_re =~ v
67 @ar_re = /class.*(#{@config[:activerecord_classes].join("|")})/
27 :activerecord_classes => ["ActiveRecord::Base"],
ここまで。1.92.0ではclass定義の開始行に"ActiveRecord::Base"があるか否かで対象を判断しているようでした。
ancestorsを使って判断するように変えてみようとしたのだけれど想像以上にふくらんでしまい挫折。
class SeafoodCurry < Curry # < ActiveRecord::Base
end
としたら出るようになったので、ひとまずこれで。
RubyForge: Ruby-GetText-Package: リリースノート
* Improve to support mo-files.
* Support revision 1 of mo-file format.
* Freeze msgstrs.
1.92.0からフリーズされるようになってました。
flash[:notice] = _('Foo')
flash[:notice] << _('Bar') if ~
とかしてるとおこられますよ。
class Curry < ActiveRecord::Base; end
class SeafoodCurry < Curry; end
class VegetableCurry < Curry; end
という関係のクラスがあって、
map.resources :curries
という定義がしてある場合の話。
すべてCurryとして編集したかったのだけれど、
<% form_for(@curry) do |f| %>
のところで詰まってしまった。
[13:05 追記] @curryはSeafoodCurryやVegetableCurryのインスタンスです。
こう書いたら、
undefined method `seafood_curry_path' for #<ActionView::Base:0xb7149864>
だとか
undefined method `vegetable_curry_path' for #<ActionView::Base:0xb72efdd0>
のように、子クラスでルートをつくろうとしているらしく、おこられてしまう。ただインスタンスを投げているだけだからこれはしかたない。
で、問題はここから。form_forを呼ぶときにアップキャストすればいいだけだと思ったのだけれど、そもそもキャストってないじゃないか、と。
ドキュメントを読んだら
Module: ActionView::Helpers::FormHelper
Resource-oriented style
<% form_for @post do |f| %>
は
<% form_for :post, @post, :url => post_path(@post), :html => { :method => :put, :class => "edit_post", :id => "edit_post_45" } do |f| %>
となるらしいのでこれをベタ書きで対応したのだけれど、いかんせん長すぎる。
なんかスマートな方法があるんじゃないかと思うのだけれど、どこかで道を間違ったのかなぁ。
以前.autotestに書いたままになっていたhookが、いつの間にやら効かなくなっていたので調べてみました。
原因は、
ZenTest-3.10.0/lib/autotest.rb
645 def self.add_hook(name, &block)
646 HOOKS[name] << block
647 end
のようにそれぞれのhookに複数のブロックを登録出来るようになっていて、実際に呼ばれるところでは
636 HOOKS[name].any? do |plugin|
637 plugin[self]
638 end
のようにいずれかのブロックがtrueを返すと以降のブロックは実行されないようになっていたことでした。
なるほどなるほど、と納得したところで問題が。
続きを読む…
GemCasts
便利そうなRubyGemsを使ってみるゲーム実況動画風、プログラミング実況動画です。
komagataさんがたんたんと続けられている動画サイトです。最新では実際にGemをつくって公開してます。
ゲーム実況プレイ風ってのが、社内勉強会を彷彿とさせていいなー。