Rails:评论帖子

时间:2014-08-06 08:39:39

标签: ruby-on-rails comments

我正在创建一个网站博客,并且不知道我将如何在博客中添加评论。有没有宝石或技巧?你能帮助我并给我一些提示吗?

2 个答案:

答案 0 :(得分:2)

没有"技巧" - 您只需像应用程序的其余部分一样对其进行编码。


<强>协会

由于您的comments将与posts直接关联,因此首先要查看两个模型之间的关联

#app/models/comment.rb
Class Comment < ActiveRecord::Base
   belongs_to :post
end

#app/models/post.rb
Class Post < ActiveRecord::Base
   has_many :comments
end

这种关联的重要性在于,如果你想创建评论,虽然它们是他们自己的个人对象,但他们必须被捆绑并且#34;&#34;到一个帖子。这一点的重要性在于Ruby / Rails的object-orientated性质:

-

<强> OOP

enter image description here

大多数人都没有意识到,由于Ruby是一种面向对象的语言,Rails也是一个面向对象的框架。

这意味着您需要构建围绕对象的方法,操作等。大多数初学者认为你只需要创造一个“逻辑”的逻辑。应用流程 - 而现实是你需要构建你的应用围绕你想要服务的对象

-

<强>资源

除此之外,您还需要考虑如何与应用程序中的资源/对象进行交互。我建议使用nested resources来执行此操作:

#config/routes.rb
resources :posts do
   resources :comments #-> domain.com/posts/5/comments/new
end

这一点很重要的原因在于你可以用它创建一个comment

#app/controllers/comments_controller.rb
Class CommentsController < ApplicationController
   def new
      @post = Post.find params[:post_id]
      @comment = Comment.new
   end

   def create
      @post = Post.find params[:post_id]
      @comment = Comment.new(comment_params)
   end

   private

   def comment_params
      params.require(:comment).permit(:comment, :params, :post_id)
   end
end

这允许您使用以下内容:

#app/views/comments/new.html.erb
<%= form_for [@post, @comment] do |f| %>
   <%= f.text_field :comment_attributes %>
   <%= f.submit %>
<% end %>

这将帮助您创建comment个对象作为所需post个对象的子对象 - 让您能够为每个帖子创建评论。


<强>加成

此处的奖励是,如果您想nest您网站上的评论,那么您将要使用Ancestry gem,如下所示:

enter image description here

这样做的方法相对简单。如果您设置了评论创建系统,如上所述,您需要将ancestry gem添加到Comment模型中:

#app/models/comments.rb
Class Comment < ActiveRecord::Base
   has_ancestry
end

您需要将ancestry列迁移到comments数据表,然后才能填充ancestry属性:

enter image description here

然后,您可以使用以下部分以tree方式显示评论:

#app/views/comments/_tree.html.erb
<ol class="categories">
    <% collection.arrange.each do |category, sub_item| %>
        <li>
            <div class="category">
                <%= link_to category.title, edit_admin_category_path(category) %>
            </div>

            <!-- Children -->
            <% if category.has_children? %>
                <%= render partial: "category", locals: { collection: category.children } %>
            <% end %>

        </li>
    <% end %>
</ol>

然后您可以按如下方式调用它:

<%= render partial: "comments/tree", locals: { collecton: @comments } %>

答案 1 :(得分:0)

您可以实施外部评论引擎,例如Disqus,或者通过制作与您的帖子有关系的评论资源将其保留在内部,例如

class Post < ActiveRecord::Base
  has_many :comments
end

class Comment < ActiveRecord::Base
  belongs_to :post
end

通过这种方式,您可以正确地处理评论。

它需要一些其他工作,控制器,观点......但精神就在那里。