他の方の考え方を知るのって、楽しいよね:-)
お忙しい最中、いろいろとお手間をお取り頂きまして。
誠にありがとうございます。 => 問題点が分かってきた気がする
えーっと。
前提として。
僕は、コントローラは、リソースをコントロールするもの"ではなく"、リクエストに対しての、アプリの振る舞いを規定するものだと思っています。
リクエストがあって、そのリクエストを解釈して、対応するリソース(モデル)を引くなり積むなりして、その戻り値をもって、レンダラを通してレスポンスを返すもの、ですね。
もちろん、その考え方が正しいのかどうかは知りませんよ?:-D
という前提で。
なるほど。こういう話ですね。で、私のスタンスはリソースとして親子関係があるならそう扱うのがいいんじゃないか? というスタンスです。id:lov2muchさんとけっこう近い、ですかね?
そこはバッチリ一致ですね:-)
で、僕が、ホントに、Post(親リソース)とComment(子リソース)を扱う場合は、もう一つ、post_comments_controller.rbを作ります。
post_comments_controller.rbが、Post.commentsとしてCommentリソースをCRUDさせるコントローラであることは、云わずもがなですね:-)
で、config/routes.rbで、
map.resources :posts do |post| post.resources :comments, :controller => "post_comments" end
にします。
これで、
GET /posts/:post_id/comments
POST /posts/:post_id/comments
GET /posts/:post_id/comments/new
GET /posts/:post_id/comment/:id
PUT /posts/:post_id/comment/:id
GET /posts/:post_id/comment/:id/edit
DELETE /posts/:post_id/comment/:id
が満たせますね。
で、なんで、comments_controller.rbでやらないのか、というと、
さて、そこで問題となるのが上記コードで★をつけたところです。1つ目はPost以外の親を使いたい場合や、(このケースではないと思いますが)Commentを直接作りたい場合です。これをスマートにポリモーフィックにしたい。
これですね。
- 明示的にPostリソースの一部(=子リソース)であることを示したい
- 既に用意されている機能があるのなら、それをウマく利用したい
- 判定/分岐を増やしたくない
- 別ルーティンを増やしたくない
- スコープは出来得る限り狭くしたい(拡張される可能性が微塵にでも在るのなら)
からです。
あと、ナニゲに「そもそもCommentのCRUDはCommentsControllerでやりたいって云うのなら、Post#showでコメントをリストする=Commentリソースに対するREADだって筋違いだってことになるじゃん」等とボソっとつぶやいてみるwww
だから、
私や瀧内さんの前提として、ここでは結局のところCommentリソースを作っているので、やっぱりそれに対してCRUDしたいわけです。
というのが、腑に落ちないんですね。多分。
というかCommentsControllerでやるのが2.x系のRailsのやりかたじゃないかと思うわけです。賛成なさるかどうかは別として、こうしたいと思っていることはご理解くださいませ。
はい。おっしゃることは、理解しているつもりです。
批判をしているのでは無いんですよ。
やり方は一杯在ると思いますし、絶対的に正しいやり方なんて云うのは、存在しないとも思っています。
なんていうのかな、僕の中で、「まどろっこしい/回りくどいやり方をするのは、Rails的じゃないんじゃね?」と思っているから、ですかね。
という感じでした。
ご指導有り難う御座居ました。
:-)