在Rails中实现注释的最佳方法是什么?

时间:2010-12-24 18:22:52

标签: ruby-on-rails

要点:我想发布Post has_many评论,但我不想创建单独的评论控制器和后续视图。主要是因为评论永远不会出现在帖子的SHOW动作中的任何其他地方。还是我打破了MVC范式?

3 个答案:

答案 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等)。

话虽这么说,你总是可以把事情搞砸,以便你的评论上的动作将用户引回到发起它的帖子。因此,评论相关的操作将驻留在评论控制器中,但用户通常使用帖子(及其相关的评论)。