我已经尝试了每一个评论宝石,他们几乎都很糟糕。
看看我之前提出的这个问题: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
这样的东西答案 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
希望这有帮助!