【Ruby on Rails全栈课程】4.6 评论功能实现(五)--删除评论

简介: 1、在routes.rb文件中添加路径

1、在routes.rb文件中添加路径


get 'posts/delete_comment/:comment_id' => 'posts#delete_comment'


2、在posts_controller.rb文件中添加delete_comment方法


def delete_comment
end


3、在comment.rb文件中添加get_account_right方法,来获取当前用户是否有删除该评论的权利,有的话,在帖子详情页面中评论的后面显示删除按钮,没有的话不显示。


#判断当前用户是否有删除评论的权利
def get_account_right(current_user)
    #当没有用户登录,不显示删除链接
    if current_user.blank?
        boolean = false
    #当前用户的role字段为1、2时,代表是管理员、超级管理员,有删除评论的权利
    elsif current_user.role > 0
        boolean = true
    #如果是自己发布的评论,可以删除
    elsif current_user.id == self.account_id
        boolean = true
    else
        boolean = false
    end
    boolean
end


代码解析:


boolean


倒数第二行代码boolean其实就是return boolean的意思,返回boolean的值。boolean = true代表有删除评论的权利,boolean = false代表没有删除评论的权利。用某个Comment对象调用get_account_right(current_user)方法,就会返回boolean的值。


4、修改partial文件views/posts/_show_posts.html.erb,在「回复」a标签的下面加入「删除」a标签(注意有两处位置)


<!--参考代码,无需粘贴-->
<!--<a id="reply<%= comment.id %>" οnclick="outIn(<%=comment.id%>,<%=comment.id%>)">回复</a>-->
<!--添加「删除」a标签-->
<% if comment.get_account_right(@current_user) %>
  <a href="/posts/delete_comment/<%= comment.id %>">删除</a>
<% end %>


<!--参考代码,无需粘贴-->
<!--<a id="reply<%= re.id %>" οnclick="outIn(<%= comment.id %>,<%=re.id%>)"> 回复</a>-->
<!--添加「删除」a标签-->
<% if re.get_account_right(@current_user) %>
  <a href="/posts/delete_comment/<%= re.id %>">删除</a>
<% end %>


5、分析错误


强调一下,修改之后的文件要记住保存哦~不然看不到效果。保存文件后,rails s启动项目,然后打开帖子详情页面,发布一条评论,再点击评论后面的删除链接可能会出现以下错误:


image.png


处理这个错误我们需要先来复习一下网页请求的路径:


根据请求链接/posts/delete_comment/1,在routes.rb文件中根据get ‘posts/delete_comment/:comment_id’ => 'posts#delete_comment’语句找到posts_controller里面的delete_comment方法。如果delete_comment方法里面没有render或者redirect_to语句指定接下来要去的views页面,系统会自动找posts文件夹下的delete_comment.html.erb文件。


所以,出现上面错误的原因,是因为delete_comment方法里面没有render或者redirect_to语句,并且系统也没有找到posts文件夹下的delete_comment.html.erb文件。所以碰到此类的错误ActionController::UnknownFormat有两种解决思路:


(1)给controller中的delete_comment方法添加render或者redirect_to语句


(2)给「删除」a标签加上data-remote=“true",实现ajax,这样系统如果找不到相应名字的模板,就会render到head :no_content(意思的不加载任何内容),还会停留在帖子详情页面。


因为此链接实现的目的是删除评论,「删除评论」是一个动作,不需要页面,删除动作完成之后回到帖子详情页面即可,所以我们先选择A解决方案,给controller中的delete_comment方法添加render或者redirect_to语句。下面来完善一下posts_controller里面的delete_comment方法。


6、完善posts_controller.rb文件delete_comment方法


def delete_comment
    comment_id = params[:comment_id]
    comment = Comment.find(comment_id)
    post_id = comment.post_id
    #comment表中status为1代表自己删除,为2代表管理员删除
    boolean = false
    if @current_user.id == comment.account_id
      comment.status = 1
    else @current_user.role > 0
      comment.status = 2
    end
    boolean = comment.save
    if boolean
        flash.notice = "删除成功"
    else
        flash.notice = "删除失败,请重新删除"
    end
    redirect_to "/posts/show_posts/#{post_id}"
end

重启项目重试,现在删除功能可以正常操作了。


但是有一个问题,这个问题需要多创建几条评论才能看出来,我们创建12条评论,然后到第二页,删除第二页的某条评论,你会发现页面会刷新,重新回到第一页,想要看删除后的效果,需要再点击到第二页才能看到,用户体验不好。


这是因为在controller的delete_comment方法中用redirect_to重定向到帖子详情页面(/posts/show_posts/#{post_id}),所以页面会刷新,想要实现删除第二页的评论,页面仍旧停留在第二页,并且能马上看到删除效果的功能,需要通过ajax来改善(即上面第5节分析错误中的解决方案2)。


7、改善删除效果


我们想要的效果是用户点击删除,还是停留在当前页面,并且显示出删除后的效果。这个效果我们需要通过ajaz和js来配合实现。与之前点赞功能的思路是一样的。

######(1)修改partial文件views/posts/_show_posts.html.erb,将「删除」a标签加上ajax以及js方法。(注意有两处需要修改)


<!--原代码-->
<a href="/posts/delete_comment/<%= comment.id %>">删除</a>
<!--改为-->
<a data-remote="true" href="/posts/delete_comment/<%= comment.id %>" onclick="putDel()">删除</a>


<!--原代码-->
<a href="/posts/delete_comment/<%= re.id %>">删除</a>
<!--改为-->
<a data-remote="true" href="/posts/delete_comment/<%= re.id %>" onclick="putDel()">删除</a>


(2)编辑partial文件views/posts/_show_posts.html.erb,添加js方法putDel()


<script type="text/javascript">
function putDel(comment_id) {
  var content = document.getElementById("content_" + comment_id);
  var timeRight = document.getElementById("time_" + comment_id);
  content.innerHTML = "<span class='delete-content'>该评论已删除</span>";
  timeRight.style.display = "none";
 }
</script>


代码解析:


如果a标签中href元素与onclick元素同时存在,会先执行onclick,后执行href。所以当我们点击「删除」a标签时,会先执行js方法putDel(),将页面上的需要删除的评论的内容改为“该评论已删除”,其实现在还没有实际删除掉该评论,然后再执行href链接,找到对应的controller里面的delete_comment方法,在后台实际删掉该评论。


(3)修改posts_controller.rb文件中的delete_comment方法,将redirect_to和flash相关代码去掉。因为flash是下一次请求时才执行,没有redirect_to就没有flash的用武之地了。


def delete_comment
  comment_id = params[:comment_id]
  comment = Comment.find(comment_id)
  post_id = comment.post_id
  #comment表中status为1代表自己删除,为2代表管理员删除
  if @current_user.id == comment.account_id
    comment.status = 1
  else @current_user.role > 0
    comment.status = 2
  end
  comment.save
end


重启项目,我们再来看一下效果,点击删除按钮,不会刷新页面。被删除的评论会变为“该评论已删除”,然后停止项目到控制台(rails c)中,会看到该评论的status字段变成了1,说明已经被自己删除掉了。


目录
相关文章
|
3月前
|
前端开发 测试技术 数据库
使用Ruby on Rails进行快速Web开发的技术探索
【8月更文挑战第12天】Ruby on Rails以其高效、灵活和易于维护的特点,成为了快速Web开发领域的佼佼者。通过遵循Rails的约定和最佳实践,开发者可以更加专注于业务逻辑的实现,快速构建出高质量的Web应用。当然,正如任何技术框架一样,Rails也有其适用场景和局限性,开发者需要根据项目需求和个人偏好做出合适的选择。
|
3月前
|
前端开发 测试技术 API
揭秘Ruby on Rails的神秘力量:如何让你的Web应用飞起来?
【8月更文挑战第31天】Ruby on Rails(简称RoR)是一个基于Ruby语言的开源Web应用框架,自2005年发布以来,因简洁的语法、强大的功能和高效的开发效率而广受好评。RoR采用MVC架构,提高代码可读性和可维护性,拥有庞大的社区和丰富的库支持。本文通过示例代码展示其强大之处,并介绍RoR的核心概念与最佳实践,帮助开发者更高效地构建Web应用。
41 0
|
3月前
|
前端开发 API C++
在Ruby世界中寻找你的Web框架灵魂伴侣:Rails vs Sinatra
【8月更文挑战第31天】在Ruby的世界里,选择Web框架如同挑选衣物,需根据场合和需求。Rails与Sinatra是两大热门框架,前者以其“约定优于配置”理念和全面的功能成为企业级应用的首选;后者则以轻量级和灵活性著称,适用于快速原型开发和小规模应用。通过对比两者特性,如Rails的MVC架构与Sinatra的简洁API,我们可以看到它们各有所长。选择合适的框架,如同找到旅途中的最佳伙伴,让开发之路更加顺畅愉悦。这场探索之旅教会我们,没有绝对的好坏,只有最适合的选择。
33 0
|
3月前
|
安全 前端开发 数据安全/隐私保护
如何在Ruby on Rails中打造坚不可摧的OAuth认证机制
【8月更文挑战第31天】在构建现代Web应用时,认证与授权至关重要。本文介绍如何在Ruby on Rails中实现OAuth认证,通过使用`omniauth`和`devise` gems简化流程。首先安装并配置相关gem,接着在`User`模型中处理OAuth回调,最后设置路由及控制器完成登录流程。借助OAuth,用户可使用第三方服务安全地进行身份验证,提升应用安全性与用户体验。随着OAuth标准的演进,这一机制将在Rails项目中得到更广泛应用。
48 0
|
4月前
|
SQL 安全 数据库
Ruby on Rails 数据库迁移操作深度解析
【7月更文挑战第19天】Rails 的数据库迁移功能是一个强大的工具,它帮助开发者以版本控制的方式管理数据库结构的变更。通过遵循最佳实践,并合理利用 Rails 提供的迁移命令和方法,我们可以更加高效、安全地管理数据库结构,确保应用的稳定性和可扩展性。
|
5月前
|
前端开发 测试技术 数据库
Ruby on Rails:快速开发Web应用的秘密
【6月更文挑战第9天】Ruby on Rails,一款基于Ruby的Web开发框架,以其高效、简洁和强大备受青睐。通过“约定优于配置”减少配置工作,内置丰富功能库加速开发,如路由、数据库访问。活跃的社区和海量资源提供支持,MVC架构与RESTful设计确保代码清晰可扩展。高效的数据库迁移和测试工具保证质量。Rails是快速构建Web应用的理想选择,未来将持续影响Web开发领域。
|
6月前
|
开发框架 安全 前端开发
使用Ruby on Rails进行快速Web开发
【5月更文挑战第27天】Ruby on Rails是一款基于Ruby的高效Web开发框架,以其快速开发、简洁优雅和强大的社区支持著称。遵循“约定优于配置”,Rails简化了开发流程,通过MVC架构保持代码清晰。安装Ruby和Rails后,可使用命令行工具创建项目、定义模型、控制器和视图,配置路由,并运行测试。借助Gem扩展功能,优化性能和确保安全性,Rails是快速构建高质量Web应用的理想选择。
|
6月前
|
Ruby
|
6月前
|
JSON 数据格式 Ruby
|
6月前
|
调度 Ruby