前回 疑問だった
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
で打ち消す事が出来る。
では、前回の続きを
を見ながら続けていってみる。
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設計を身につけるまではルーティングを実務で使うのは控えたいと思っている。(早く覚えたい・・・。)