【Ruby on Rails全栈课程】4.1 点赞功能

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 1、功能描述:(1)一个用户对同一帖子只能点赞一次,点击第二次是取消赞(2)用户不刷新页面的时候,点赞时当前页面相应贴子的点赞数+1,图标变成fa-thumbs-up,取消赞时当前页面相应帖子的点赞数-1,图标变成fa-thumbs-o-up,不受其他用户同时点赞操作的影响,这需要js来控制。C、用户必须登录才能给帖子点赞。没有登录的话,点赞需要提醒登录。(在3.10章第3节已经实现了 if @current_user)

1、功能描述:


(1)一个用户对同一帖子只能点赞一次,点击第二次是取消赞


(2)用户不刷新页面的时候,点赞时当前页面相应贴子的点赞数+1,图标变成fa-thumbs-up,取消赞时当前页面相应帖子的点赞数-1,图标变成fa-thumbs-o-up,不受其他用户同时点赞操作的影响,这需要js来控制。


C、用户必须登录才能给帖子点赞。没有登录的话,点赞需要提醒登录。(在3.10章第3节已经实现了 if @current_user)


2、创建thumbs表来保存点赞信息,表结构如下:

image.png

3、执行命令创建thumbs表格


#产生映射文件
/vagrant/data_symtem$ rails g model thumb account_id:integer post_id:integer is_thumb:boolean
#系统返回信息
    create    db/migrate/20181031104807_create_thumbs.rb
    create    app/models/thumb.rb
    invoke    test_unit
    create      test/models/thumb_test.rb
    create      test/fixtures/thumbs.yml
#将映射文件映射到数据库
/vagrant/data_symtem$ rake db:migrate
#系统返回信息
 == 20181031104807 CreateThumbs: migrating =====================================
 -- create_table(:thumbs)
   -> 0.0137s
 == 20181031104807 CreateThumbs: migrated (0.0153s) ============================


4、在routes.rb文件中添加路由,来指定点击点赞按钮,调用的action以及定义要传递给action的参数


 get 'posts/create_thumb/:post_id/:is_thumb' => 'posts#create_thumb'


代码解析:


get 'posts/create_thumb/:post_id/:is_thumb' => 'posts#create_thumb'

后面跟的/:post_id/:is_thumb是通过链接跳转传递的参数,在routes中定义参数,在views中给参数赋值,最后可在controller中通过param[:post_id]取出参数


5、在posts_controller.rb文件中添加方法create_thumb


def create_thumb
  post_id = params[:post_id]
  is_thumb = params[:is_thumb]
  account_id = @current_user.id
  thumb = Thumb.find_or_create_by(account_id:account_id,post_id:post_id)
  if is_thumb == "0"
    thumb.is_thumb = false
  elsif is_thumb == "1"
    thumb.is_thumb = true
  end
  thumb.save
end


代码解析

is_thumb = params[:is_thumb]


:is_thumb是通过/posts/create_thumb/:post_id/:is_thumb链接传递过来的参数,is_thumb为0代表取消点赞,为1代表点赞



thumb = Thumb.find_or_create_by(account_id:account_id,post_id:post_id)


假设account_id为1,post_id为3,此行代码的意思是查找Thumb表中是否有account_id为1,post_id为3对应的数据,有的话,直接查找出来,没有的话,就创建一个account_id为1,post_id为3的thumb数据。


6、编辑app/models/post.rb文件中get_thumbs、get_thumb_info方法,用来获取帖子的点赞数,以及判断当然用户是否给该帖子点过赞


#获取点赞数
def get_thumbs
  num = Thumb.where(post_id:self.id,is_thumb:true).count
end
#获取此用户是否给该帖子点过赞,默认为未点过
def get_thumb_info(account_id)
  thumb = Thumb.find_by(post_id:self.id,account_id:account_id)
  boolean = false
  if thumb && thumb.is_thumb
    boolean = true
  end
end


代码解析:


num = Thumb.where(post_id:self.id,is_thumb:true).count


代码中的self代表当前调用该方法的实例对象,这里的self指的是Post对象


7、编辑views/home/index.html.erb文件,在最下面加上js方法


当点击点赞<a>标签,会调用js方法praiseReplay(oldTotal),oldTotal代表点赞<a>标签。


如果oldTotal中的class元素为fa fa-thumbs-up(已点赞图标),说明当前用户已给该贴点过赞了,本次点击是需要将赞取消,将class元素换成fa fa-thumbs-o-up(未点赞图标),将oldTotal里面的内容innerHTML(即当前点赞数)减1,将href元素中传递的is_thumb参数换成0,这样在页面点赞数减1之后,后台数据库中的数据会和页面同步。


<script type="text/javascript">
  function praiseReplay(oldTotal){
    if(oldTotal.className == "fa fa-thumbs-up")
    {
      oldTotal.className = "fa fa-thumbs-o-up";
      var oldValue = oldTotal.innerHTML;
      oldTotal.innerHTML = " " + (parseInt(oldValue) - 1);
      href = oldTotal.href
      oldTotal.href = href.substring(0, href.length - 1) + "0"
    }
    else
    {
      oldTotal.className = "fa fa-thumbs-up";
      var oldValue = oldTotal.innerHTML;
      oldTotal.innerHTML = " " + (parseInt(oldValue) + 1);
      href = oldTotal.href
      oldTotal.href = href.substring(0, href.length - 1) + "1"
    }
  }
</script>


8、编辑views/home/index.html.erb文件,调用js方法


<!--原代码-->
<a data-remote="true" href="#" id="reduce" class="fa fa-thumbs-up">
<!--改为-->
<a data-remote="true" href="/posts/create_thumb/<%= p.id %>/0" id="reduce" class="fa fa-thumbs-up" onclick="praiseReplay(this)">
<!--原代码-->
<a data-remote="true" href="#" id="increase" class="fa fa-thumbs-o-up">
<!--改为-->
<a data-remote="true" href="/posts/create_thumb/<%= p.id %>/1" id="increase" class="fa fa-thumbs-o-up" onclick="praiseReplay(this)">


代码解析:


<a data-remote="true" href="/posts/create_thumb/<%= p.id %>/0" id="reduce" class="fa fa-thumbs-up" onclick="praiseReplay(this)">


当a标签中同时有href、onclick两个元素时,先执行onclick中的方法,再执行a标签,所以这句代码的意思为:先执行onclick中的praiseReplay方法,将页面上的赞数减1(此时数据库里面的数据还没变),然后在通过a标签链接找到posts_controller中的

create_thumb方法,通过 /<%= p.id %>/0 这两个参数找到Thumb表中的对应数据,将这条数据的is_thumb字段改为false


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