他の方の考え方を知るのって、楽しいよね:-)

お忙しい最中、いろいろとお手間をお取り頂きまして。
誠にありがとうございます。 => 問題点が分かってきた気がする


えーっと。
前提として。
僕は、コントローラは、リソースをコントロールするもの"ではなく"、リクエストに対しての、アプリの振る舞いを規定するものだと思っています。
リクエストがあって、そのリクエストを解釈して、対応するリソース(モデル)を引くなり積むなりして、その戻り値をもって、レンダラを通してレスポンスを返すもの、ですね。
もちろん、その考え方が正しいのかどうかは知りませんよ?:-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的じゃないんじゃね?」と思っているから、ですかね。


という感じでした。
ご指導有り難う御座居ました。
:-)