Rails用户关联评论

时间:2013-06-12 17:28:04

标签: ruby-on-rails devise comments associations

我有一个用户脚手架(DEVISE),一个评论脚手架和一个电影脚手架

目前,评论已发布在电影显示页面上。

我遇到的麻烦就是让用户创建评论。因此评论是由用户创建的。

因此,如果我在movies/:show

中显示评论

我能做到

身体:<%= comment.body %> 作者:<%= comment.user.first_name %>

我如何发表评论属于用户,并且只有该用户可编辑且可销毁?

请不要告诉使用before_filter :authenticate_user!, only: [:create,:destroy] 或者遵循带有Microposts的Michael Hartl教程,因为我已经完成了这两个并且它们不起作用

无论如何,有谁知道我怎么做到这一点?

MAny谢谢

4 个答案:

答案 0 :(得分:2)

首先,我只会向所有者显示editdestroy链接:

<% if comment.user == current_user %>
  <%= link_to "edit", ... %>
  <%= link_to "delete", ... %>
<% end %>

然后,如果知道如何在chrome中使用inspect元素的聪明人,我会对评论所有者进行控制器级别检查:

def edit
  @comment = Comment.find(params[:id])
  if @comment.user == current_user
    @comment.update_attributes(....)
    @message = "Comment updated or created or deleted, depends on method"
  else
    @message = "It's not your comment wise guy :)"
  end
  redirect_to :back, notice: @message
end

与销毁和更新方法相同。

!不是复制/粘贴就绪代码。

这就是我曾经做过的事情而且效果很好,其他方法你可以使用gem cancan https://github.com/ryanb/cancan并为用户设置能力。

can :edit, Comment, :user_id => user.id
can :destroy, Comment, :user_id => user.id

以这种方式设置能力只有所有者才能访问编辑页面和更新,销毁操作。

答案 1 :(得分:1)

关于设计助手'current_user'的内容是什么?像这样的东西:

class Comment < ActiveRecord::Base
  belongs_to :user
end

class CommentsController < ApplicationController
  def edit
    comment = current_user.comments.where(id: params[:id]).first
    if comment.nil?
      ...
      401 error or something else (current user is not creator of this comment)
    else
     ...
    end
   end
end

您还可以查看视图中的权限:

<% if comment.user == current_user %>
  <%= link_to "edit comment" ... %>
  <%= link_to "delete comment" ... %>
<% end %>

答案 2 :(得分:0)

要使评论属于用户,请执行create操作:

comment = current_user.comments.new(params[:comment])

使其仅对所有者

可编辑/可销毁
before_filter :find_comment, only: [:show, :edit, :update, :destroy]
before_filter :authorize_user!, only: [:edit, :update, :destroy]
#...

private

  def find_comment
    @comment = Comment.find params[:id]
  end

  def authorize_user!
    deny_access if @comment.user != current_user # example
  end

答案 3 :(得分:0)

确保用户使用:authenticate_user!登录是一件好事,但您必须将评论与该用户相关联。

Devise为您提供current_user。因此,如果您的Comment belongs_to :userUser has_many :comments写在CommentsController中:

def new
  @comment= current_user.comments.new
end

def create
  @comment= current_user.comments.new(params[:comment])
  if @comment.save
    ...
  end
end

def edit
  @comment= current_user.comments.find(params[:id])
end

def update
  @comment= current_user.comments.find(params[:id])
  if @comment.update_attributes(params[:comment])
    ...
  end
end