投票和业力的简单评论

时间:2014-02-14 23:31:35

标签: ruby-on-rails ruby gem

我已经尝试了每一个评论宝石,他们几乎都很糟糕。

看看我之前提出的这个问题:Finding user total votes recieved on posts by other users

根据建议,我决定从头开始建立自己的评论系统。

这是目标:

拥有帖子模型,用户模型(使用设计),评论模型。

用户可以创建评论。这些评论是可以投票的。用户在评论中收到的投票总额是他们的得分或业力。

我该如何实现这样的目标?

到目前为止,这就是我所拥有的:

我跑了

rails generate model Comment commenter:string body:text post:references

迁移

class CreateComments < ActiveRecord::Migration
  def change
    create_table :comments do |t|
      t.string :commenter
      t.text :body
      t.references :post

      t.timestamps
    end

    add_index :comments, :post_id
  end
end

在我的评论模型中

class Comment < ActiveRecord::Base
  belongs_to :post
  attr_accessible :commenter, :body
end

在我的帖子模型中

class Post < ActiveRecord::Base
  has_many :comments
end

我的路线档案

resources :posts do
  resources :comments
end

我的评论控制器

class CommentsController < ApplicationController
  def create
    @post = Post.find(params[:post_id])
    @comment = @post.comments.create(params[:comment].permit(:commenter, :body))
    redirect_to post_path(@post)
  end
end

在我的帖子中显示视图

<h2>Comments</h2>
<% @post.comments.each do |comment| %>
  <p>
    <strong>Commenter:</strong>
    <%= comment.commenter %>
 </p>

 <p>
   <strong>Comment:</strong>
   <%= comment.body %>
 </p>

<% end %>

<%= form_for([@post, @post.comments.build]) do |f| %>
  <p>
    <%= f.label :commenter %><br />
    <%= f.text_field :commenter %>
  </p>
  <p>
    <%= f.label :body %><br />
    <%= f.text_area :body %>
  </p>
  <p>
    <%= f.submit %>
  </p>
 <% end %>

<%= link_to 'Edit Post', edit_post_path(@post) %> |
<%= link_to 'Back to Posts', posts_path %>

我真的需要帮助:我需要控制器要求用户登录,而不是选择评论者名称,并将当前用户作为评论的评论员传递。如何实施评论的编辑?

然后我需要使用这些宝石中的任何一个来使评论可以投票:

https://github.com/bouchard/thumbs_up

https://github.com/ryanto/acts_as_votable

最后,我需要能够计算给定用户在所有发布的评论中收到的总票数。像@ user.comments.votes.size

这样的东西

1 个答案:

答案 0 :(得分:1)

要处理为评论分配current_user,首先您需要将commenter列更改为引用用户的ID(我还会将其重命名为commenter_id)。所以,你需要像这样生成模型:

rails generate migration ChangeCommentsCommenterToCommenterId

# db/migrate/<timestamp>_change_comments_commenter_to_commenter_id.rb
class ChangeCommentsCommenterToCommenterId < ActiveRecord::Migration
  def change
    remove_column :comments, :commenter
    add_column :comments, :commenter_id, :integer, null: false
    add_index :comments, :commenter_id
  end
end

或者,从头开始重新生成模型:

rails generate model Comment commenter_id:integer:index body:text post:references

请注意,我已为列添加了索引。在Comment模型中:

# app/models/comment.rb
class Comment < ActiveRecord::Base
  belongs_to :post
  belongs_to :commenter, class_name: 'User'
  attr_accessible :body
end

请注意,由于我们在此处使用belongs_to,因此当您将commenter消息发送到Comment的实例时,您将获得User的实例}。

接下来,您需要更新控制器以进行正确的用户分配。我还建议对私有方法进行一些重构,以使实现更具表现力:

# app/controllers/comments_controller.rb
class CommentsController < ApplicationController
  def create
    post.comments.create(new_comment_params) do |comment|
      comment.commenter = current_user
    end
    redirect_to post_path(post)
  end

  private

  def new_comment_params
    params.require(:comment).permit(:body)
  end

  def post
    @post ||= Post.find(params[:post_id])
  end
end

由于您要重定向到post_path,我假设您不需要保留@comment实例变量。

最后,您需要从视图中的表单中删除commenter字段。这样做有用吗?

[编辑:添加此部分以解决有关投票的问题......]

我并不完全清楚你正在寻求帮助的投票的哪些部分,但至少从高级别的角度来看,我猜你可能想要一个VotesController可以从嵌套路线访问:

# config/routes.rb
...
resources :comments do
  resources :votes, except: :index
end

希望这有帮助!