前回 疑問だった

helper :all

について調べてみた。

調べた結果、「ActionController::Base」(※このクラスは噂のMetalを継承していた。少し感動)に

def self.inherited(klass)
super
klass.helper :all if klass.superclass == ActionController::Base
end

と言う記載があった。

これは、RubyのClassオブジェクトのメソッドでここ に定義が記載されている。

すなわち、サブクラスが定義された時に呼び出されるのだ。

ここで、サブクラスが「ActionController::Base」を継承している場合に全てのヘルパーが呼び出されるのだ。

ちなみに

clear_helpers

で打ち消す事が出来る。



では、前回の続きを


WEB+DB PRESS Vol.58/編
¥1,554
Amazon.co.jp


を見ながら続けていってみる。

Commentを作って見る。

rails g model comment post:references comment:string name:string

Commentのモデルはこれで完成。

スペルを間違えたり「:」の数を間違えると面倒なことになるのでご注意を。僕としては「post:references comment:string name:string」の部分は後でマイグレーションに直接書く方が性に合っている。

では、こいつをPOSTモデルからHas_manyで繋げてあげよう。

has_many :comments

その後にルーティングの指定をしてあげる。

Rails3ではこの部分の仕組みが大きく変わった・・・らしいのだが、そもそも僕がREST設計を殆どしていないためこの部分の知識が乏しい。

なので悲しい事だが僕にはルーティングの部分がどう変わったかの説明が出来ない。(Rails2でも殆どこの部分を触って無いのだ。)なので、この部分をRails3から学ぼうと思っている。(*1)


で、ルーティング部分を以下のようにします。

resources :posts do
resources :comments, :onry => [:new, :create]
end

これによって、NewとCreateの部分を使う指定が出来るようです。(いまいち理解していない。)

あと、Commentコントローラーを作成します。

rails g controller comments

その後にPostデータを表示する、「view/post/show.hml.erb」の最後に以下のコードを追加します。

<%= render @post.comments.build %>

う~ん。

何をしているのかさっぱりわかりませんね。

Scaffoldで生成された

<%= f.submit %>

も「New」と「Edit」で表示文言が違うし・・・。(これはI18nを経由して値を決定しているらしいがどのようにI18nを設定すればよいかは不明。。。)色々謎が多い。


Rails3ではRenderメソッドにインスタンスを渡すと「_インスタンス名」と言うパーシャルを指すと言う仕様になっているようです。本当にRest色が強くなってますね。


と言う事で、

Views/Comments/_comment.html.erb

にコメントの処理を書けば良いので書いてみる・・・。

Missing partial comments/comment with
{:handlers=>[:erb, :rjs, :builder, :rhtml, :rxml],
:formats=>[:html], :locale=>[:en, :en]} in view paths
"***test_app/app/views"

(※実際は一行)

!?

謎のエラーが発生した。

・・・と思ったらファイル名を「comment.html.erb」で作ってた。凡ミス。ただ、エラーが分かりにくくて一瞬何を間違えたか分からなかった。Rails2でMissing Templateが出た場合は「ファイル名を指して存在しません。」と言う警告が出ていたので分かりやすかったのだが・・・。


・・・と言う事で、この続きはまた次回。

早くJQueryを使ってみたい。



*1・・・僕の主観かもしれないが、REST設計は素人が下手に手を出さない方が良いと思っている。その理由はREST設計にするとリソースを中心に設計をする必要が出てくる、URLの設計がとても難しくなるからである。特に大規模でリソースの設計が困難を極める場合は無理やりRESTにするのは得策ではない気がする。

なので、僕はREST設計を身につけるまではルーティングを実務で使うのは控えたいと思っている。(早く覚えたい・・・。)