从数据库中删除注释并查看Ruby on Rails

时间:2014-08-06 21:07:56

标签: ruby-on-rails comments

我是Rails的新手,所以请对我很轻松。

我正在使用Commontator Gem在我的rails应用上启用评论。问题是,当我删除我的评论,而不是完全消失(这是我正在寻找的),删除的评论仍然在我的视图中显示如此“评论删除'usename'”。我想我需要为我的评论创建删除路线。目前rake路线的输出是:

Routes for Commontator::Engine:
    delete_comment PUT   /comments/:id/delete(.:format)             commontator/comments#delete
  undelete_comment PUT   /comments/:id/undelete(.:format)           commontator/comments#undelete

评论模型

def can_be_deleted_by?(user)
      mod_perm = thread.config.moderator_permissions.to_sym
      return true if thread.can_be_edited_by?(user) &&\
                     (mod_perm == :e ||\
                       mod_perm == :d)
      comment_del = thread.config.comment_deletion.to_sym
      !thread.is_closed? && (!is_deleted? || editor == user) &&\
      user == creator && comment_del != :n &&\
      (is_latest? || comment_del == :a) &&\
      thread.can_be_read_by?(user)
    end

以下是在评论控制器

中删除评论的方法
def delete
      security_transgression_unless @comment.can_be_deleted_by?(@user)

      @comment.errors.add(:base, t('commontator.comment.errors.already_deleted')) \
        unless @comment.delete_by(@user)

      respond_to do |format|
        format.html { redirect_to @thread }
        format.js { render :delete }
      end
    end

我需要执行哪些步骤才能将注释从数据库中完全删除?

1 个答案:

答案 0 :(得分:1)

首先我建议你重构一下can_be_deleted_by?方法,正如我在评论中提到的那样,因为宝石没有得到很好的记录或支持,所以可能值得推出自己的解决方案(或looking for another gem)。

您应该考虑Pundit来管理授权规则,但这是对can_be_deleted_by?方法的简单修复:

def can_be_deleted_by?(user)
  [can_be_etc?, can_be_etc_etc?].all?
end

def can_be_etc?
end

def can_be_etc_etc?
end

它仍然是一个粗略的结构,但它比将所有逻辑投入单一方法要好得多。

回答你的问题

您可能不得不深入挖掘宝石的源代码,因为文档非常缺乏。一种方法,如果他们不提供原生支持:

添加default_scope或命名为scope并用于过滤评论

def Comment
  # update with correct column (deleted_by is a guess)
  scope :active, -> { where(deleted_by: nil) }
end

# view
# also assuming you have direct access to comments
@article.comments.active.each [...]

如果这变得很困难,作为最后的手段,您可以添加default_scope,每次查询注释时都会应用{},并且必须手动禁用(如果您想访问已删除的注释)。