我是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
我需要执行哪些步骤才能将注释从数据库中完全删除?
答案 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
,每次查询注释时都会应用{},并且必须手动禁用(如果您想访问已删除的注释)。