要点:我想发布Post has_many评论,但我不想创建单独的评论控制器和后续视图。主要是因为评论永远不会出现在帖子的SHOW动作中的任何其他地方。还是我打破了MVC范式?
答案 0 :(得分:1)
正如你所说,你打破了MVC范式。 MVC的重点是将所有内容拆分为一口大小的块,以便更易于管理。这就是我至少看到它的方式。
如果没有针对它们的特定控制器,将如何创建注释。 Post
上的显示部分很容易:
@comments = @post.comments
答案 1 :(得分:1)
系统的内部域模型与系统公开的公共接口之间存在根本区别。
如果您使用的是关系数据库,那么最好使用
Comment.belongs_to :post
Post.has_many :comments
系统的内部域模型可以帮助您设计公共界面 - 但您也可以根据需要定制公共界面,而不必强制将其严格反映在您的内部域模型中!
在您的情况下,我建议您使用CommentsController
。但是在这个控制器类中,你不需要所有正常的REST动作。你只需要其中一些。
# app/controllers/comments_controller.rb
class CommentsController < ApplicationController
respond_to :js
def create
@post = Post.find(params[:post_id])
@comment = post.comments.create(params[:comment])
respond_with [@post, @comment]
end
end
在此控制器中,仅有一个create
操作,该操作将成为显示帖子的页面底部“新评论”表单的目标。您不需要任何其他REST操作,因为人们从不单独查看,编辑或删除注释 - 它们只创建新注释,而不是从专用的新注释页面创建。其路由如下:
# config/routes.rb
MyApp::Application.routes.draw do
resources :posts do
resources :comments, :only => [:create]
end
end
答案 2 :(得分:0)
您越偏离MVC范例,您以后遇到的问题就越多。例如,如果您想为评论添加管理员视图,则通过评论控制器进行扩展会更容易。否则,您最终会在帖子控制器中对您的评论进行多项操作(例如,approve_comment,delete_comment,voteup_comment等)。
话虽这么说,你总是可以把事情搞砸,以便你的评论上的动作将用户引回到发起它的帖子。因此,评论相关的操作将驻留在评论控制器中,但用户通常使用帖子(及其相关的评论)。