从修复 testerhome(rubychina)网站的一个 bug 学习 rubyrails on ruby

news/2024/5/20 13:20:45/文章来源:https://blog.csdn.net/dengzhao4204/article/details/102295630

前言

testerhome: http://testerhome.com/topics/1480

对于一个差点脱离前沿技术人,想要学习ruby,就意味着要放弃熟悉的操作系统windows,熟悉的ide-eclipse,更重要的是要从java这种重量级编译型语言的编程思想强行转换为ruby这种轻量级解释执行语言编程思想。这个过程远比我想象的要难,总是抱着以前以java编程思想,通吃vb,C#的傲慢,虽然js还算可以,但js的编程思想与java也是很像的,经过这次打击让我意识到我掉队了。但仍有一部分经验可以帮助我入手新的技术,这篇文章一方面是警醒自己,另一方面也希望能将这次的学习过程分享给想要学习一门语言的同学。

正文

至于为什么选择ruby,中间的选择过程也费了一些时日,主要是在python和ruby之间比较,放弃python的重要理由是python的语法令我找不到北,还有那每个包下的_init_.py文件,请原谅我思想过于老化,无论如何都接受不了。而ruby,给我感觉就比较优雅易理解,虽然社区和资源不如python。过程曲折,就不赘述了。

看清现状

要学习一门新技术,首先要知道自己会什么,新技术涉及到了什么。

linux&shell脚本 ruby最好还是在linux下学习开发吧,我在windows下虽然也搭建成功了,但装了例如 devkit 我也是醉了。
开发工具 工欲善事,必先利器。其实我是被eclipse惯的,实在不想像原来学习java一样,从文本编辑器开始,编译执行。。。我选择了rubymine,是jetbrain出的,基于IntelliJ IDEA。其强大自不必说了。
2efccef2e33a909a97e3dcf32c53a727.png
对我来说上面这两条满足就够了,至于编程经验什么的,我认为如果没有编程经验,反而还好一些,这样不会被以前的思想干扰。

看清需要什么之后,就去熟悉他们吧,下载安装blablabla....

学习方法

万事具备之后,就要考虑应该怎么学习ruby,是去买本书?找网络教学视频找资料?。。。无论哪种方法,要选择合适自己的。对于有编程经验的人,我建议先去看语法,练上几个小例子,深层次的不需要太多考虑。然后就实践,无论是自己编写一个小程序还是去修改bug都可以。没有编程经验的人,这里就不好办了,按照通常的做法,需要学习面向对象编程思想、数据结构、网络通信以及其他一些必备的IT技能。当然这里不是说要按部就班的去学,如果对自己有信心可以直接从视频教程、ruby书籍开始学习。

贴一个ruby的视频教程:http://edu.51cto.com/lesson/id-10162.html

  1. 我是先去看语法:http://www.w3cschool.cc/ruby/ruby-tutorial.html
    w3cschool的语法虽然有一些已经过时了,但不影响了解ruby,看的过程中就跟着例子上手实践了。花了两天时间~

  2. 接下来就要选择是做一个小程序?还是找个一个现成的去修改代码修改bug。我选择了后者,原因就是因为在testerhome里玩的时候发现了一个bug。这里请没有框架使用经验的新手不要选择后者,自己先做一些像计算器之类的小程序。因为一般的现成的程序中,会使用一些框架,里面蕴含了框架的思想,如果不理解这个思想是找不到北的。

bug标题:testerhome论坛,社区帖子列表的分页数量不正确
bug描述:进入“社区”菜单,下方的分页栏,其页数是100,但点击100页后,里面没有数据。这里的分页数量不是根据实际数据生成的,是错误的。
截图:
d969ce8b1cf321960dd4df1e568f866c.png

修复bug过程

要想修复这个bug,首先要有源码,还要知道论坛的架构。混坛子里的肯定都知道了,源码在@lihuazhang群主的github中就有,而论坛是使用的rubychina的源码,架构是rails on ruby.

参考:http://www.cnblogs.com/likeyu/archive/2012/02/25/2367379.html

环境搭建什么的就不赘述了,就从bug分析开始吧

  1. 这个bug的原因不难想象,程序中计算分页的代码有问题。我们要追到这部分代码,就要先去找页面。那接下来就观察一下工程结构
    4e28fedca0d47d99b625b9a688d22d5c.png
    接下来就是我的初步猜测
  • app 论坛业务所在
  • bin 忽略,二进制对业务无影响
  • config 一些配置
  • db 数据库相关
  • doc 里面是readme,看一眼有没有有用的,忽略
  • faye_server 不知道是什么,实在找不到的时候才去研究它
  • lib 引用的库,忽略
  • log 日志忽略
  • misc 存放了一些资源,忽略
  • public 里面放了404.html等公用的错误页、跳转页什么的,忽略
  • script 就放了rails文件,忽略
  • spec 不知道什么,rubymine将其颜色设置为灰色,看来是没什么影响忽略
  1. 有了上面的分析,那么入手点就找到了,我们关注app中的内容,那么就展开看看吧
    913626d8cd09d4a8450f70ba95025508.png
    从这个目录结构中,如果对web框架有所熟悉,一定会立刻找到切入点,views文件夹,因为视图就是表现层,说白了就是组织web页面,展开后观察一下[社区列表]这个页面在哪里
    5e57a2516e6864cacfc771ffd1fffe14.png
    从中不难看出topics就是页面所在了,展开topics文件夹,找可能页面去观察代码,最终将页面定位到index.html.erb。

  2. 问题页面定位到了,我们就开始观察代码吧

<div class="content"><div class="box box_gray"><div id="node_info"><%= render "topics/node_info", node: @node %></div><div class="topics"><% if @topics.current_page == 1 %><% cache(@suggest_topics) do %><%= render partial: "topics/topic", collection: @suggest_topics, locals: { suggest: true } %><% end %><% end %><%= render partial: "topics/topic", collection: @topics, locals: { suggest: false } %></div><%= will_paginate @topics, inner_window: 2 %></div>......

注意这一行<%= will_paginate @topics, inner_window: 2 %>,说的很清楚,will_paginate分页。好了,找到了逻辑处理部分的代码,本来按照我老旧的思路,去找will_paginate方法,结果发现这个方法并不是业务逻辑处理,只是一个rails通用方法,那么谁才是业务逻辑处理呢,如果使用过web框架的就会想到mvc,rails也是如此。好,这时候还记得目录结构吧,上面app目录下有一个controllers文件夹,业务处理就在这里了,从中很容易猜到topics_controller.rb。来看下代码

# coding: utf-8
class TopicsController < ApplicationControllerload_and_authorize_resource only: [:new, :edit, :create, :update, :destroy,:favorite, :unfavorite, :follow, :unfollow, :suggest, :unsuggest]caches_action :feed, :node_feed, expires_in: 1.hoursdef index@suggest_topics = Topic.without_hide_nodes.suggest.limit(3)suggest_topic_ids = @suggest_topics.map(&:id)@topics = Topic.last_actived.without_hide_nodes.where(:_id.nin => suggest_topic_ids) #去数据库查询有多少帖子@topics = @topics.fields_for_list.includes(:user) #这部不太明白,但不影响分析@topics = @topics.paginate(page: params[:page], per_page: 15, total_entries: 1500)#这个方法就是计算分页了,可以从参数看出每页15个帖子,但total_entries这个参数却给了一个固定值1500,那么也就是说分100页。。。。bug就在这里set_seo_meta '', "#{Setting.app_name}#{t("menu.topics")}"end... ...#代码多,就看上面这部分吧

上面代码中的注释就是我对代码的分析。我们继续跟到@topics.paginate方法中,

# coding: utf-8
require 'will_paginate'
require 'will_paginate/collection'module Mongoidmodule WillPaginateextend ActiveSupport::Concerndef paginate(options = {})options = base_options options::WillPaginate::Collection.create(options[:page], options[:per_page]) do |pager| #从这里读到意思是根据传入的分页参数创建一个分页集合然后遍历每页,将每页的帖子展示items_count = options[:total_entries] || self.count #这块就需要了解ruby的语法了,||类似于三目运算,意思是若`options[:total_entries]!=nil`则`items_count=options[:total_entries]`,若`options[:total_entries]=nil`,则`items_count=self.count',转换为业务说法就是,若传入的总贴数为nil则计算数据库中查询出的帖子数量,这里显然逻辑错误。无论何时都应当使用数据库中查询出的帖子数量fill_pager_with self.skip(options[:offset]).limit(options[:per_page]), items_count, pagerendend......

问题定位清楚了,就开始想怎么改,已经说过了,无论何时都应当使用数据库中查询出的帖子数量。按照这个思路,我们先以调试模式启动testerhome这个web应用,启动后就可以访问本地调试环境的testerhome了
85daafe25259aed50a66ef4d5d0319ea.png
在调试之前,我们需要取得管理员权限,具体的方法可以查看http://www.cnblogs.com/likeyu/archive/2012/02/25/2367379.html这位同学写的。
我们进入http://localhost:3000/cpanel添加分类和节点,这样才能发帖。
接下来我们就要动代码了,首先我们在app/controllers/topics_controller.rb文件中,将代码修改为如下:

# coding: utf-8
class TopicsController < ApplicationControllerload_and_authorize_resource only: [:new, :edit, :create, :update, :destroy,:favorite, :unfavorite, :follow, :unfollow, :suggest, :unsuggest]caches_action :feed, :node_feed, expires_in: 1.hoursdef index@suggest_topics = Topic.without_hide_nodes.suggest.limit(3)suggest_topic_ids = @suggest_topics.map(&:id)@topics = Topic.last_actived.without_hide_nodes.where(:_id.nin => suggest_topic_ids) #去数据库查询有多少帖子@topics = @topics.fields_for_list.includes(:user) #这部不太明白,但不影响分析@topics = @topics.paginate(page: params[:page], per_page: 15)#去掉total_entries:1500这个参数,不能写死帖子总数set_seo_meta '', "#{Setting.app_name}#{t("menu.topics")}"end... ...#代码多,就看上面这部分吧

同时要将app/models/mongoid/will_paginate.rb文件中的代码修改如下:

# coding: utf-8
require 'will_paginate'
require 'will_paginate/collection'module Mongoidmodule WillPaginateextend ActiveSupport::Concerndef paginate(options = {})options = base_options options::WillPaginate::Collection.create(options[:page], options[:per_page]) do |pager| #从这里读到意思是根据传入的分页参数创建一个分页集合然后遍历每页,将每页的帖子展示items_count = self.count #不需要total_entries参数,我们使用从数据库中查询出的帖子数目fill_pager_with self.skip(options[:offset]).limit(options[:per_page]), items_count, pagerendend......

代码修改完成,接着就去浏览器中访问testerhome,进入社区帖子列表,新建16个帖子,因为我们要看出效果,需要至少2页。造完数据后,我们可以看到如下结果
3683feb2d5c36457e2b3b4537df30cee.png
从中可以看到当前的分页已经正常了,16条数据,分了2页,同时也试试点击第2页,看看是否显示正常。

至此这个bug就修复了。

最后

之所以想要修复这个bug,是因为我们是testerhome,那么看到bug就不能放过,同时也为社区贡献点东西,只是改完这个没法真实测试,这个需要@lihuazhang群主帮忙了,话说我这古董技术,到现在对git还不熟。另外,在没有看到rubychina那位仁兄写的rubychina实践之前,不知道管理员怎么进,就去学了mongodb,好不容易学会了,去数据库里看到user里有一个admin,但密码是加密的,咋办,,,只好自己注册了一个用户,然后将这个用户的加密密码替换了admin的密码,结果发现仍然访问不了后台管理,最后才找到那篇文章,豁然开朗。这次解决问题的过程,其中有很多都是靠着经验猜出来的,对与rails框架我还不熟悉,通过这次解决问题已经看清一点论轮廓了。希望能帮助到那些想学习开发的新手,同时也欢迎ruby大神给点建议!

最后的最后希望,testerhome能越来越好~各位tester事业生活一帆风顺~好不容易有时间写点东西,又有点忙了,请新秀群不要踢我啊 ?,我要学的东西还有很多,以后有时间写东西一定会写~ ?

转载于:https://www.cnblogs.com/zzzhuxf/p/4026463.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_885403.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站GZip优化

什么是Gzip压缩&#xff1f; 当用户点击我们的网站时&#xff0c;服务器提供的文件越大&#xff0c;到用户的浏览器并显示在屏幕上所需的时间就越长。 GZIP在传输他们到浏览器之前压缩网页和样式表&#xff0c;大大减少了传输时间&#xff0c;因为这些文件小得多。 GZIP压缩…

Spring Boot监听器记录网站访问人数

一、场景 使用Spring Boot框架&#xff0c;通过监听器记录网站访问人数和网站访问量。 二、实现 1.通过监听器创建存储访问信息的初始化变量 Override public void contextInitialized(ServletContextEvent servletContextEvent) {logger.info("ServletContext上下文初…

nginx网站优化提速工具ngx_pagespeed进入beta阶段

Page Speed是谷歌提供的一个Web优化工具&#xff0c;它可以对网站的Web服务器配置和前端代码执行若干测试&#xff0c;并提供优化建议。 在此工具的基础上&#xff0c;谷歌针对Apache、nginx服务器提供了一个傻瓜式的优化工具mod_pagespeed、 ngx_pagespeed&#xff0c;这些工…

纯css 应用使得网站各个模块切换 平滑过渡

首先创建一个百分百的 layout 然后创建各个panel layout 然后应用按钮加上平滑过渡效果 这样会使得网页更加丰富生动 <div class"st-container"><input type"radio" name"radio-set" checked"checked" id"st-control-1&…

推荐一款神器,桌面远程调试IOS网站的工具 很好很强大 支持国产!

MIHTool 是前端工程师在iOS设备上调试和优化页面的得力助手. 首先app Store下载 MIHTOOL。 然后安装后地址栏打开所需要调试的网站&#xff0c;然后会弹出本地使用的ip地址 类似这样的 http://192.168.1.165:1630/devtool/client/#leZV6e 然后&#xff0c;出现如下界面就等于就…

利用代理页面解决html iframe跨域访问网站问题

转自&#xff1a;http://www.zuidaima.com/share/1854884509142016.htm 在做项目的时候遇到跨域问题&#xff0c;经过自己的一番摸索终于找到一种解决iframe跨域问题的方案&#xff0c;或许很多人也会遇到这样头疼的问题&#xff0c;希望能尽自己绵薄之力帮助大家。如果不清楚或…

web安全/渗透测试(四):收集目标网站信息的网站

一、http://whois.domaintools.com/ 查找目标网站所有者的信息 二、https://sitereport.netcraft.com/?url site report入口输入目标网站地址 查找目标网站使用的技术&#xff0c;包括服务器的技术和客户端的技术 三、https://www.robtex.com/ 查找关于目标网站的DNS信…

第一篇——胡咧咧之动漫素材如何最有效最快的查找下载,动漫网站有哪些?

第一篇——胡咧咧之动漫素材如何最有效最快的查找下载&#xff0c;动漫网站有哪些&#xff1f; 大家好&#xff0c;我是祥小和&#xff0c;喜欢我的可以点赞收藏&#xff0c;让我去吃灰了&#xff0c;鼓掌。。。 我之所以写博客&#xff0c;是因为我记性不太好&#xff0c;难…

【笔记1】chrome网站技术分析插件:Wappalyzer

1、下载&#xff1a; 插件下载地址&#xff1a;https://chrome.zzzmh.cn/info?tokengppongmhjkpfnbhagpmjfkannfbllamg 2、安装&#xff1a; chorme中打开&#xff1a;chrome://extensions/ 可以把下载的.crx文件拖到浏览器中安装 也可以手动导入插件 3、使用&#xff1a; 在…

Python学习笔记 - 使用django的内置功能开发网站(详细)

Python学习笔记 - 使用django的内置功能开发网站&#xff08;详细&#xff09; Part 1 | 基本操作 安装django模块 django是第三方模块&#xff0c;因此需要下载。这里介绍2种下载方式。 使用PyCharm下载django 打开PyCharm&#xff0c;在菜单栏中找到: File > Setting…

Python学习笔记 - 使用django模块开发网站(较详细)

注&#xff1a;我上次的django开发教程&#xff1a;点击这里 Python学习笔记 - 使用django模块开发网站(较详细) 下载 & 安装django django是Python的第三方模块&#xff0c;需要下载安装。使用pip安装django非常简易1。 pip install django新建项目 cmd窗口输入命令:…

中医自学平台---前端网站

使用开源的框架vue-admin-template&#xff08;https://github.com/PanJiaChen/vue-admin-template&#xff09;。 这个需要提前安装node。 可以用nvm来管理和安装node。 然后设nvm的镜像源&#xff1a; nvm node_mirror https://npm.taobao.org/mirrors/node/ nvm npm_mir…

Web开发人员应当收藏的10个网站

Web开发人员应当收藏的10个网站 互联网上有数百万的网站可以提供服务&#xff0c;其中只有一些对Web开发员来说是极为有效的工具。在本文中&#xff0c;Jean-Baptiste Jung整理出了10个极有用的网站&#xff0c;绝对值得Web开发者收藏到书签中。 1. Mysql Format Date 通过MySQ…

实战--Scrapy框架爬去网站信息

Scrapy的框架图 一、使用Strapy抓取网站一共需要四个步骤&#xff1a; (1)创建一个Scrapy项目&#xff1b; (2)定义Item容器&#xff1b; Item是保存爬取到的数据的容器&#xff0c;其使用方法和python字典类似&#xff0c;并且提供了额外保护机制来i避免拼写错误导致的未定义…

最新手写图片爬虫(针对千库网和一个福利网站)

前言&#xff1a;由于前一段时期需要从网站上扒一些图片下来&#xff0c;因为css&#xff0c;js都好扒&#xff0c;就是图片数量众多&#xff0c;需要代码实现&#xff0c;在网上找了一堆以实现的代码&#xff0c;要么没有用&#xff0c;要么功能不是自己想要的&#xff0c;干脆…

.Net修改网站项目调试时的虚拟目录

有些项目需要在IIS发布的时候&#xff0c;将网站发布到虚拟目录&#xff0c;为了保持调试和发布的路径同一&#xff0c;一般会修改VS调试的虚拟目录 一、Web应用程序 Web应用程序的修改方式非常简单&#xff0c;在解决方案资源管理器->项目>右键>属性>Web>服务…

在云服务器上建立网站

1.修改ECS实例的安全组规则&#xff0c;开放Web服务端口 新购买的ECS实例默认已开启远程管理端口&#xff08;22、3389&#xff09;&#xff0c;若希望在云服务器上建立网站&#xff0c;还需要开启80端口。 点击右侧“更多—更改安全组” 点击“新建安全组” 默认状态是没有…

阿里云服务器或者其他网站绑定域名方法

阿里云服务器或者其他网站绑定域名方法 |浏览&#xff1a;6896|更新&#xff1a;2014-04-18 17:25|标签&#xff1a;域名 1 2 3 4 分步阅读 阿里云服务器或者其他服务器绑定域名方法。添加高级网站标志&#xff0c;使域名解析。 工具/原料 服务区 已解析域名或者站点 方法/步骤…

阿里云服务器或者其他网站绑定域名方法

阿里云服务器或者其他网站绑定域名方法 |浏览&#xff1a;6896|更新&#xff1a;2014-04-18 17:25|标签&#xff1a;域名 1 2 3 4 分步阅读 阿里云服务器或者其他服务器绑定域名方法。添加高级网站标志&#xff0c;使域名解析。 工具/原料 服务区 已解析域名或者站点 方法/步骤…

高性能网站使用的14条技术

Translated by mask 从2004年开始&#xff0c;我开始进入雅虎的异常表现小组。我们是一个很小的队伍&#xff0c;专门针对雅虎的产品进行质量检测和改进&#xff0c;我作为一个后端工程师&#xff0c;现在却开始捣鼓前端代码优化方面的工程&#xff0c;所以我认为这是一个极好…