Ruby on rails开发从头来(windows)(三十六)- 调试技巧

这次我们来看看一些关于调试的小提示。

首先,而且也是最重要的就是,编写测试代码,在Rails里编写单元测试和功能测试都很简单,使用它们,可以减低bug发生率,也可以避免在你从前的代码中突然出现bug。

测试代码告诉你哪些东西能够工作,哪些不能,并且,测试代码帮助你隔离那些有问题的代码,因为有时候bug并非很快地表现出来。

如果问题发生在一个Model中,我们可以使用脚本script/console来模拟一个irb对话,在其中进行跟踪,例如下面这样:

Z:\study\ruby\InstantRails\rails_apps\depot>ruby script/console
Loading development environment.>> pr = Product.find(:first)
=> #<Product:0x4b969ec @attributes={"image_url"=>"http://www.dearbook.com.>> pr.price
=> #<BigDecimal:4b913d4,'0.12351E3',8(12)>
>> pr.image_url
=> "jpg/lastTS00168921__.jpg"
>> pr.save
=> true
>>

我们先在depot项目的命令行中使用ruby script/console来启动irb会话,蓝色的部分是我在irb会话中输入的命令。

另外,在复杂的程序中使用Log也是一个好办法,你可以在log文件中找到大量有价值的信息,当一些意外情况发生,Log文件应该是你第一个要检查的地方。还有,检查服务器的log文件也是很有用的,如果你使用WEBrick作为web服务器,也可以使用脚本script/server来启动一个会话。

我们可以使用Logger对象来输出我们想查看的信息,有时候log文件非常繁忙,以至于很难找到你所添加的log,如果你使用WEBrick,你可以使用STDERR来将你的log输出到控制台上(InstantRails使用的Mongrel不能进入命令行)。

如果一个页面显示了错误的内容,我们也许想导出控制器中的对象,方法debug()能帮助我们,该方法很好的格式化对象的内容,并且判断对象的内容是不是合法的HTML,例如:

<h3>Your Order</h3>
<%= debug(@order) %>
<div id="ordersummary">
...</div>

最后,在上面的方法都不能排除bug的时候,我们来尝试跟踪调试程序,但是只限于环境配置为development的程序,下面是使用断点(breakpoint)的步骤:

1.在你需要程序停下来的地方添加breakpoint()方法的调用。

2.在项目的根目录键入命令:depot>ruby script/breakpointer。

打开浏览器,使你的程序能够命中调用breakpoint方法的代码,这时候浏览器会停止响应,在命令行窗口会打开irb会话,在这里,你可以查看变量的值,或者添加断点,当你推出irb会话,在浏览器里,程序就会继续运行。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索命令
, 程序
, script
, 方法
, 代码
, 一个
Ruby命令行
ruby on rails 调试、ruby on rails、ruby on rails 教程、ruby rails、ruby on rails pdf,以便于您获取更多的相关知识。

时间: 2024-08-04 01:39:20

Ruby on rails开发从头来(windows)(三十六)- 调试技巧的相关文章

Ruby on rails开发从头来(五十六)- ActiveRecord基础(一对多关联关系)

一对多关联可以使我们表示一组对象,例如,一个order可以包含有任意多个line item,在数据库中,所有的line item记录都通过外键关联到特定的order. 在Active Record中,通过在父对象中的has_many来定义到子对象的关联,在子对象中使用belongs_to来指定父对象.我们已经在上一篇中了解了belongs_to声明,实际上,在一对多的情况下,和一对一是相同的,所以我们来了解has_many声明. 开发从头来(五十六)- ActiveRecord基础(一对多关联关

Ruby on rails开发从头来(三十八)- ActiveRecord基础(列和属性)

ActiveRecord中的一个对象相当于数据库中表的一行,对象的属性对应于表的列,也许你会注意到我们的Order类没有提及关于orders表的任何东西,这是因为ActiveRecord在运行时来确定这些对应关系,Active Record将数据库中的模式反应到类中. 我们的orders表可能使用下面的sql来创建: create table orders ( id int not null auto_increment, name varchar(100) not null, email va

Ruby on rails开发从头来(四十六)- ActiveRecord基础(SQL和Active Record)

想象一下Active Record是如何处理SQL的,我们来看看find方法的:conditions参数,调用的时候像这样:find(:all,:conditions=>-),这里的:conditions参数决定了find方法将返回哪些记录,它相当于Sql语句的where部分,例如,要获取所有的名字为Dave,pay_type为po的订单,我们这样写: pos = Order.find(:all,:conditions => "name = 'dave' and pay_type =

Ruby on rails开发从头来(三十九)- ActiveRecord基础(访问属性)

如果在一个model对象中有一个名为balance的属性,你可以通过索引操作符来获取该属性的值,你可以使用一个字符串或者标记,在这里我们使用标记,例如: account[:balance] #=> 获取值 account[:balance] = 0.0 #=> 设置值 但是这种常见的代码是不提倡的,更好的是这样,利用ruby的访问方法: account.balance #=> 获取值 account.balance = 0.0 #=>设置值 在这里,我们使用了两种方法来获取属性的值

Ruby on rails开发从头来(五十五)- ActiveRecord基础(一对一关联关系)

一对一关联,或者更正确的说是一对零或一对一关联,是通过外键引用到另外一张表中的至多一条记录实现的,下图描述了orders表和invoices表的关系: 开发从头来(五十五)- ActiveRecord基础(一对一关联关系)-rails activerecord"> 在Active Record中,要表示这样的关系需要在Order类中添加has_one:Invoice声明,并且同时在Invoice类中添加声明belongs_to:order,事实上,我们可以把这种关联关系看作是相互的,我们可

Ruby on rails开发从头来(三十七)- ActiveRecord基础

ActiveRecord是Rails提供的一个对象关系映射(ORM)层,从这篇开始,我们来了解Active Record的一些基础内容,连接数据库,映射表,访问数据等. Active Record使用基本的ORM模式:表映射成类,行映射成为对象,列映射成对象的属性.与很多大量使用配置的ORM库不同,Active Record最小化了配置.想象一下,有一个使用Active Record的程序把Mysql数据库中的orders表转换到类,通过制定的ID查找到order,设定order的名称,然后保存

Ruby on rails开发从头来(五十四)- ActiveRecord基础(指定关联关系)

Rails支持三种表间关联关系,一对一,一对多,多对多,你需要在Model中加入声明来标识这些关联:has_one,has_many,belongs_to,has_and_belongs_to_many. 一对一关联关系可能存在于象订单和发票这样的关系,一个订单只能有一个发票,在Rails中,我们这样指明: class Order < ActiveRecord::Base has_one :invoice . . . class Invoice < ActiveRecord::Base bel

Ruby on rails开发从头来(四十)- ActiveRecord基础(Boolean属性)

一些数据库支持boolean类型,而另一些则不支持,这使得Active Record要抽象boolean类型变得困难.例如,如果数据库不支持boolean类型,有的开发者使用char(1)来替代,而内容使用"t"和"f"来表示true和false,而另外一些开发者使用integer类型,0是false,1是true.即使数据库支持boolean类型,在内部也许还是使用0和1来存储. 在Ruby里,在条件判断中,数字0和字符f都被认为是true值,这就意味着如果你直接

Ruby on rails开发从头来(五十九)- ActiveRecord基础(预加载子记录)

预加载子记录讨论的问题和"延迟加载"是相同的.通常Active Record会推迟从数据库中加载子记录,直到你需要他们,例如,通过Rdoc中的例子,我们假定博客程序有一个Model,像下面这样: class Post < ActiveRecord::Base belongs_to :author has_many :comments, :order => 'created_on DESC' end 如果我们遍历所有的post,访问作者和评论属性,我们使用一个Sql查询来返回

Ruby on rails开发从头来(五十八)- ActiveRecord基础(自关联)

或许存在这样的情况,在一个表中,一条记录关联到表中的另一条记录,例如,公司中的每个雇员都有上级和下级,而他们同时又是雇员,在Rails中你可以这样使用Employee类: class Employee < ActiveRecord::Base belongs_to :manager, :class_name => "Employee", :foreign_key => "manager_id" belongs_to :mentor, :class_